深拷贝和浅拷贝 区别和代码

103 阅读1分钟
  1. 浅拷贝的概念:浅拷贝只是拷贝一层,更深层次的对象级别的只拷贝引用地址,
  2. 深拷贝的概念:深拷贝会拷贝多层,每一级的数据都会拷贝
  3. 弊端

浅拷贝:我们会发现通过浅拷贝更深层次的引用类型,如果修改 b.googs,最终 obj.goods 也会跟着修改,是因为在拷贝的时候,我们只是将引用地址拷贝给了 b.goods,也就是说 b.goods 和 ob.goodsj 引用的是同一个对象

  1. 浅拷贝

    var obj = {
      id: 1,
      name: "章三",
      msg: {
        age: 18,
      },
    };
    
    var o = {};
    
    // 方式一:const key in obj
    for (const key in obj) {
      o[key] = obj[key];
    }
    
    
    // 方式二:Object.assign() 
    // 建议使用 Es6 中新增的 Object.assign() 方法实现浅拷贝
    Object.assign(o, obj);
    obj.msg.age = 20;
    console.log(obj);
    console.log(o);
    
    // 方法三:...obj
    const obj = {
      a: 1,
      goods: { name: '鞋', price: 199 }
    }
    const b = { ...obj }
    
  2. 深拷贝

    //方法一
    //被拷贝的数组oldobj
    //拷贝的数组newobj
    function deepCopy(newobj, oldobj) {
      for (const key in oldobj) {
        // 获取对象中的属性
        var item = oldobj[key];
        if (item instanceof Array) {
          // 判断是否为数组
          newobj[key] = [];
          deepCopy(newobj[key], item);
        } else if (item instanceof Object) {
          // 判断是否为对象
          newobj[key] = {};
          deepCopy(newobj[key], item);
        } else {
          // 判断是否为普通值
          newobj[key] = item;
        }
      }
    }
    
    deepCopy(o, obj);
    obj.msg.age = 20;
    console.log(obj);
    console.log(o);
    
    //方法二
         var obj = {
            name: "zs",
            age: 20,
            father: [2, 3, 4],
          };
    
          function deepClone(target) {
            //这一行如果不用三元判断 如果是数组会有bug会被拷贝成伪数组对象
            var tempObj = Array.isArray(target) ? [] : {};
            for (var key in target) {
              if (typeof target[key] === "object") {
                tempObj[key] = deepClone(target[key]);
              } else {
                tempObj[key] = target[key];
              }
            }
            return tempObj;
          }
    
          var obj1 = deepClone(obj);
          console.log(obj1);
    

    \