深拷贝

5 阅读1分钟
  1. JSON.parse()JSON.stringify() 这是最简便的深拷贝方法,但是有限制,比如如果包含时间对象,regexp对象,error对象,函数或undefined,数据会丢失或变成空对象;如果存在循环引用会报错;性能问题,对应大型复杂对象会消耗较多内存。

  2. Object.assign()浅拷贝。对于第一层属性是深拷贝,对于嵌套在引用类型的属性则是浅拷贝。

  3. 递归实现 手写深拷贝

    function dc(obj) {
      if (typeof obj !== 'object') {
        return obj;
      }
      let newObj = obj instanceof Array ? [] : {};
      for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] !== 'object') {
            newObj[key] = obj[key];
          } else {
            newObj[key] = dc(obj[key]);
          }
        }
      }
      return newObj
    }
    
    const arr = [1,2,3,{a: 1, b: {c: 2}}]
    console.error(dc(arr))
    
  4. 使用第三方库Lodash 提供了 _.cloneDeep() 方法,能处理复杂的深拷贝需求。