深拷贝的实现

2022, Dec 07    

深拷贝的实现

   function deepClone(obj,map = new WeakMap()) {
      //基本类型
      if(typeof obj !=='object' || obj === null) return obj
      //避免循环引用
      const objFromMap = map.get(obj)
      if(objFromMap) return objFromMap

      let target = {}
      map.set(obj,target)

      //Map
      if(obj instanceof Map){
          target = new Map()
          obj.forEach((v,k) => {
              const v1 = deepClone(v,map)
              const k1 = deepClone(k,map)
              target.set(k1,v1)
          });
      }

      //Set
      if(obj instanceof Set){
          target = new Set()
          obj.forEach(v=>{
              const v1 = deepClone(v,map)
              target.add(v1)
          })
      }

      //Array
      if(obj instanceof Array){
          target = obj.map(item=> deepClone(item,map))
      }

      //Object
      for(let key in obj){
          const val = obj[key]
          const val1 = deepClone(val,map)
          target[key] = val1
      }

      return target
  }


  const a = {
      set: new Set([10, 20, 30]),
      map: new Map([['x', 10], ['y', 20]]),
      info: {
          city: 'shanghai'
      },
      fn: () => { console.info(100) }
  }
  console.log(deepClone(a))