深拷贝

166 阅读1分钟

写了个深拷贝, 但不知道在哪里找好使的测试用例哎

function cloneDeep(target, map = new WeakMap()) {
  const type = Object.prototype.toString.call(target).slice(8,-1)
  
    let cloned;
 
    switch(type){
      case 'Undefined':
      case 'Null':
      case 'String':
      case 'Number':
      case 'Boolean':
      case 'Function':
       cloned = target
        break;
      case 'Object':
        if(map.get(target)){
          cloned = map.get(target)
        }else{
         cloned = {}
         const keys = Object.keys(target)
         let i = keys.length
         while(i--){
          cloned[keys[i]] = cloneDeep(target[keys[i]],map)
         }
          map.set(target,cloned)
        }
        break;
      case 'Array':
       cloned =  target.map(item => cloneDeep(item),map)
        break;
      case 'Date':
      case 'RegExp':
        cloned = new target.constructor(target)
        break;
        
}
  return cloned
}

var r = cloneDeep({ a: "a", b: [1, 2, 3] });

console.log(r);