10+行代码实现深拷贝

158 阅读1分钟

平时开发的时候如果要拷贝一个对象用 JSON 能满足基本要求,但是复杂对象的拷贝 JSON 就满足不了了,譬如对象属性中有日期、函数、正则等,这时我们就要借助第三方库,或者,自己写一个。

乞丐版代码

var obj = {name: 'varlet'}

var cloneOjb = JSON.parse(JSON.stringify(obj))

高配版代码


const deepClone = function (obj, hash = new WeakMap()) {
    //处理循环引用
    if (hash.has(obj)) return obj;
    
    //定义通过构造函数初始化的类型
    const SPECIAL_TYPE = [Date, RegExp, Set, WeakSet, Map, WeakMap];
    
    //通过 obj 的原型创建对象
    const cloneObj = Object.create(Object.getPrototypeOf(obj),
      Object.getOwnPropertyDescriptors(obj));
  
    hash.set(obj, cloneObj);
  
    for (let key of Reflect.ownKeys(obj)) {
      const val = obj[key];
      
      if (SPECIAL_TYPE.includes(val.constructor)) { //特殊类型通过构造函数实例化
          cloneObj[key] = new val.constructor(val)
      } else if (typeof val === 'object' && val !== null) { //值为对象则递归深拷贝
          cloneObj[key] = deepClone(val, hash)
      } else { //简单对象直接赋值
          cloneObj[key] = val
      }
    }
  
    return cloneObj;
}

如有错误欢迎指出,欢迎一起讨论!