手写代码-深拷贝

65 阅读1分钟
  function deepClone(target, map = new Map()) {
    let type = getType(target)
    if (type === 'Array' || type === 'Object') {
      let cloneTarget = map.get(target)
      if (cloneTarget) {
        return cloneTarget
      }

      cloneTarget = type === 'Array' ? [] : {}
      map.set(target, cloneTarget)
      for (let key in target) {
        if (target.hasOwnProperty(key)) {
          cloneTarget[key] = deepClone(target[key], map)
        }
      }

      return cloneTarget
    } else {
      return target
    }
  }

  function getType(data) {
    return Object.prototype.toString.call(data).slice(8, -1)
  }

  const obj = {
    a: {},
    b: [],
    fn: function () {},
  }
  obj.a.c = obj.b
  obj.b[0] = obj.a

  console.log(deepClone(obj))