- 深拷贝和浅拷贝都只针对引用数据类型
- 浅拷贝:会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存
- 深拷贝:会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
1- 浅拷贝
1-1 数组中每项是简单数据类型,实现浅拷贝
- var arr = [1,2,3]
- var sum = arr
- console.log(sum); // [1,2,3]
- arr.push(4)
- console.log(sum); // [1,2,3,4]
1-2 数组中每项是复杂数据类型 ,实现浅拷贝
- var arr = [{name:"zheng"},{name:"zhang"},{name:"li"}]
- var res = [...arr]
- res[0].name="huang"  // arr变了
- res.push({name:"vue"})
- console.log(arr)  // [{name:"huang"},{name:"zhang"},{name:"li"}]
 
2- 深拷贝
2-1 每项为简单数据类型(实现深拷贝)
1- 数组里每项是简单数据类型,实现深拷贝
- /* 数组里面 每一项是基本数据类型的 是深拷贝 */
- var arr = [1,2,3]
- var sum = [...arr]
- console.log(sum);  //[1,2,3]
- arr.push(4)
- console.log(sum); // [1,2,3]
- var arr = [1,2,3]
- var sum = [].concat(arr)
- console.log(sum); // [1,2,3]
- arr.push(4)
- console.log(sum);  //[1,2,3]
- var arr = [1,2,3]
- var sum = arr.slice(0)
- console.log(sum);  // [1,2,3]
- arr.push(4)
- console.log(sum);  // [1,2,3]
2- 对象的属性是简单数据类型,实现深拷贝
- # {...obj}
- # Object.assign({},obj)
- var obj = {name:"cheng",age:18}
- //  var a = {...obj}
- var a = Object.assign({},obj)
- obj.id = 100;
- console.log(a) // {name:"cheng",age:18}
2-2 每项为复杂数据类型(array+object)
- // 遇到复杂类型(array+object)如何实现深拷贝
- // var obj = null
- var obj = {name:{name:"cheng"}} 
- function deepClone(obj){
-   // 1. 能够识别数组和对象了
-   let result;
-   if(obj instanceof Array || obj instanceof Object){
-     // 2.对拷贝的值做初始值的设定
-     if(obj instanceof Array){
-       result = []
-     }else if(typeof obj == "object"){
-       result={}
-     }
-     // 3.需要将obj克隆到result中
-     for(let key in obj){
-       result[key] = deepClone(obj[key])
-     }
-     return result
-   }else{
-     return obj
-   }
- }
- deepClone(obj)
- console.log(deepClone(obj))