浅拷贝和深拷贝
含义:
对象浅拷贝:仅仅复制对象的引用,而不是复制对象本身
对象深拷贝:把复制的对象所引用的全部对象都复制一遍,而不是单纯的引用
浅拷贝:
=
例子:
var obj1={a:0,b:{c:0}};
var obj2=obj1;
obj1.a=1;
console.log(obj1); //{a:1,b:{c:0}}
console.log(obj2); //{a:1,b:{c:0}}
obj2.a=2;
console.log(obj1); //{a:2,b:{c:0}}
console.log(obj2); //{a:2,b:{c:0}}
当改变obj1的时候obj2里面的值也改变了,由此可以看出obj2只是对obj1的一个引用,两个变量指向的数据存放的地址是一样的(例如:)
所以不管obj1改变还是obj2改变,两者都会同时改变
深拷贝:
Object.assign(target,...source):target为目标对象,source为源对象,返回目标对象
例子:
var obj1={a:0,b:{c:0}};
var obj3=Object.assign({},obj1);
obj1.a=1;
console.log(obj1); //{a:1,b:{c:0}}
console.log(obj3); //{a:0,b:{c:0}}
obj3.a=3;
console.log(obj1); //{a:1,b:{c:0}}
console.log(obj1); //{a:3,b:{c:0}}
第一层的改变通过这种拷贝是不会影响的,但是第二层以后还是受到了影响:
obj1.b.c=4;
console.log(obj1); //{a:1,b:{c:4}}
console.log(obj3); //{a:3,b:{c:4}}
还是会影响,所以应该使用
JSON.parse(JSON.stringify(XXXX))
var obj4=JSON.parse(JSON.stringify(obj1))拷贝所有层级
例子:
var obj1={a:0,b:{c:0}};
var obj4=JSON.parse(JSON.stringify(obj1));
obj4.b.c=5;
console.log(obj1); //{a:0,b:{c:0}}
console.log(obj4); //{a:0,b:{c:5}}