常问面试题之深拷贝和浅拷贝,你真的掌握了吗?(系列之分清深拷贝和浅拷贝的概念)

152 阅读1分钟

在前端面试的时候,会经常问到浅拷贝和深拷贝,很多初学者都分不清,什么是深拷贝,什么是浅拷贝,到底是什么东西,今天我们就一起来看一下吧。

上面有一个对象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 } }

浅克隆的话,如果里面属性值有是引用数据类型的,克隆对象对其属性值(引用数据)进行修改,会相互影响,因为是同一个引用地址,但是如果是深克隆的话,不会相互影响。