深拷贝

  1. 代码
    function isObject(value) {
      const valueType = typeof value
      return (value !== null) && (valueType === 'object' || valueType === 'function')
    }
    
    
    function deepClone(param, map = new WeakMap()) {
      // 判断是否是一个Set类型
      if (param instanceof Set) {
        return new Set([...param])
      }
      // 判断是否是一个Map类型
      if (param instanceof Map) {
        return new Map([...param])
      }
      // 判断symbol
      if (typeof param === 'symbol') {
        return Symbol(param.description)
      }
      // 判断非函数和对象直接返回
      if (!isObject(param) || typeof param === 'function') return param
      // 判断是数组还是对象
      // 判断是否存储过newObj (解决循环引用)
      if (map.has(param)) {
        return map.get(param)
      }
      const newObj = Array.prototype.isPrototypeOf(param) ? [] : {}
      map.set(param, newObj)
      for (let key in param) {
        newObj[key] = deepClone(param[key], map)
      }
      // 对symbol的key做特殊处理
      const symbolKeys = Object.getOwnPropertySymbols(param)
      for (const item of symbolKeys) {
        newObj[item] = deepClone(param[item], map)
      }
      return newObj
    }

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!