在前端面试的时候,会经常问到浅拷贝和深拷贝,很多初学者都分不清,什么是深拷贝,什么是浅拷贝,到底是什么东西,今天我们就一起来看一下吧。
上面有一个对象obj1,现在我想克隆一份把它给obj2;
var obj1={name:"lili",hobby:{"a":"1"}};
var obj2={};
for(var key in obj){
obj2[key]=obj[key]
}
console.log(obj1)
console.log(obj2)
接下来,我们就修改obj2里面的属性值,我们发现修改obj2第一层的属性值的时候,并没有影响obj1,但是如果我们继续修改hobby 里面的a的值的时候,我们再来看下
obj2.name="dav";
obj2.hobby=[1,2,3];
console.log(obj1); //{ name: 'lili', hobby: { a: '1' } }
console.log(obj2); // { name: 'dav', hobby: [ 1, 2, 3 ] }
我们修改obj2里面第二层属性值的时候,此时的obj1中的hobby.a 的值也发生了改变,这是为啥呢? 因为咱们在克隆的时候,obj2[key]=obj1[key] 的时候,直接把hobby属性值的引用地址赋值给了obj2的hobby 属性,(这就是浅克隆,只克隆了一层)而并不是像咱们期初那样重新赋值一个空对象,然后一个个添加属性。(这就是深克隆,克隆了多层)
var obj1 = { name: "lili", hobby: { "a": "1" } };
var obj2 = {};
for (var key in obj1) {
obj2[key] = obj1[key]
}
obj2.name="dav";
obj2.hobby.a=3;
console.log(obj1); //{ name: 'lili', hobby: { a: 3 } }
console.log(obj2); //{ name: 'dav', hobby: { a: 3 } }
浅克隆的话,如果里面属性值有是引用数据类型的,克隆对象对其属性值(引用数据)进行修改,会相互影响,因为是同一个引用地址,但是如果是深克隆的话,不会相互影响。