深拷贝与浅拷贝
1.浅拷贝(值传递):只复制第一层简单数据类型,如果有第二层(对象)就只复制第二层的地址,不会重新开辟一个空间。
通过for in 循环遍历obj1中的元素,依次赋值给obj2,但是obj1的属性中有一个dog属性也是一个对象,这样复制给obj2的只是把dog这个对象的地址复制过去了,obj2中的dog对象并没有重新开辟一个空间,相当于obj1和obj2的dog属性是共享同一个地址的,所以当你改变obj1中 dog的属性值,obj2也会相应的改变,这就是浅拷贝。
var obj1 = {
usname: 'zs',
age: '18',
dog: {
yoll: '11',
name: '哈哈'
}
var obj2 = {}
for (var k in obj1) {
obj2[k] = obj1[k];
}
console.log(obj1, obj2);
2.深拷贝-递归(地址传递),不管属性是简单还是复杂类型,都复制一遍(会重新开辟新空间),当属性里面还嵌套复杂数据类型,这个时候用递归不断往下遍历复制。
function deepCopy(ol1, ol2) {
for (var k in ol1) {
// 如果ol1里的属性是复杂数据类型,数组或者对象
if (ol1[k] instanceof Array || ol1[k] instanceof Object) {
// 如果是数组初始值为[],对象{} ,三元表达式
ol2[k] = ol2[k] instanceof Array ? [] : {};
// 如果属性里又存在复杂数据类型,嵌套很多层,这里就利用递归,不断往下找
deepCopy(ol1[k], ol2[k])
} else {
ol2[k] = ol1[k]
}
}
}
deepCopy(obj1, obj2);
obj1.usname = '修改后'
obj1.dog.yoll = '修改后'
console.log(obj1);
console.log(obj2); // 这时修改obj1里的属性后,obj2不会随之改变了