deep clone

// WeakMap 弱引用引用的对象的其他引用被清除,垃圾回收机制就会释放该对象所占用的内存。并且键只能为obj
export const _deepClone = (obj, hash = new WeakMap()) => {
  // 如果是正则或者 日期类型 直接返回一个新的实例
  if(obj instanceof RegExp) return new RegExp(obj);
  if(obj instanceof Date) return new Date(obj);
  // 如果不是对象
  if(obj === null || typeof obj !== 'object'){
    return obj;
  }
  // 如果map里有此上一级对象的子属性key  如果此子对象 == 祖对象
  if(hash.has(obj)){
    console.log(obj);
    return hash.get(obj);
  }
  // 用obj.constructor()则 如果是对象就是对象的构造函数 如果是数组 就是数组的构造函数 
  // 简而言之 就是构造一个此obj类型的 空实例
  let t = new obj.constructor();
  // 空实例 的对应键 key 为此对象
  hash.set(obj,t);
  // 遍历obj的属性
  for(let k in obj){
    if(obj.hasOwnProperty(k)){
      //1. 递归开始hash 为 {key(原对象):val:(空对象实例)}
      //2. 新实例对应属性克隆赋值
      //3. 逐个对象克隆赋值, 逐个里面对子属性如果有对象再逐层clone
      t[k] = _deepClone(obj[k],hash);
    }
  }
  return t;
}

你可能感兴趣的:(deep clone)