深拷贝

    const isObject = (obj) =>
      (typeof obj === 'object' || typeof obj === 'function') && obj !== null
    
    const deepClone = function (obj, hash = new WeakMap()) {
      if (obj.constructor === Date) {
        return new Date(obj) // 日期对象直接返回一个新的日期对象
      }
    
      if (obj.constructor === RegExp) {
        return new RegExp(obj) //正则对象直接返回一个新的正则对象
      }
    
      //如果循环引用了就用 weakMap 来解决
      if (hash.has(obj)) {
        return hash.get(obj)
      }
      let allDesc = Object.getOwnPropertyDescriptors(obj)
    
      //遍历传入参数所有键的特性
      let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc)
    
      //继承原型链
      hash.set(obj, cloneObj)
    
      for (let key of Reflect.ownKeys(obj)) {
        cloneObj[key] =
          isObject(obj[key]) && typeof obj[key] !== 'function'
            ? deepClone(obj[key], hash)
            : obj[key]
      }
      return cloneObj
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Last Updated: 10/21/2024, 4:15:17 PM