详细代码: code demo

异同:

浅复制 (影子克隆): 只复制对象的基本类型, 对象类型, 仍属于原来的引用。
深复制 (深度克隆): 不紧复制对象的基本类, 同时也复制原对象中的对象。就是说完全是新对象产生的。

思路:

遍历所有该对象的属性,
如果该属性是 "object" 则需要特殊处理,
如果这个 object 对象比较特殊,是一个数组,那就创建一个新的数组并深复制数组里的元素
如果这个 object 对象是个非数组对象,那直接再对它递归调用深复制方法即可。
如果不是 "object",则直接正常复制就行。

对象的拷贝实现

浅拷贝

const obj = {
    a:10,
    b:{
        c:'ccc'
    }
};
// 方法一:Object.assign
const a={};
Object.assign(a,obj);

//方法二:对象解构
const a = {...obj,{}}

深拷贝

function deepCopy(obj){
    // object
    if(typeof obj === 'object'){
      // 排除null;
      if(obj === null){
          return null;
      }
      // array
      if(Array.isArray(obj)){
          const newArr = [];
          for(let i=0;i<obj.length;i++){
              const item = deepCopy(obj[i]);
              newArr.push(item);
          }
          return newArr;
      }
      // other->object
      const keys = Object.keys(obj);
      const tempObj = {};
      for(let key of keys){
          const v = obj[key];
          tempObj[key] = deepCopy(v);
      }
      return tempObj;
    }else{
      return obj;
    }
};

测试

const mock = ({
    a:'111',
    b:[1,2,3,4,5,{
        s:null,
        ss:undefined,
        sss:[111]
    }],
    c:{
        cc:{
            ccc:'2222'
        },
        ccc02:[555],
    }
});

// test
const r = deepCopy(mock);
r.b.s = 'new s value'; // r.b.s =>'new s value'; mock.b.s => null

specialcoder
2.2k 声望170 粉丝

前端 设计 摄影 文学