javascript高级篇之实现深拷贝的四种方式

  • Post author:
  • Post category:java


根据转载文章(

javascript高级篇之实现深拷贝的四种方式 – 掘金

)和评论,总结出下面方法是最优解,能hold住 new date()和undefined等情况

 //深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一个一模一样的对象
  deepCopy(obj, cache = []) {
    if (obj === null || typeof obj != 'object') {
      return obj
    }
    if (Object.prototype.toString.call(obj) === '[object Date]') return new Date(obj)
    if (Object.prototype.toString.call(obj) === '[object RegExp]') return new RegExp(obj)
    if (Object.prototype.toString.call(obj) === '[object Error]') return new Error(obj)
    const item = cache.filter(item => item.origin === obj)[0]
    if (item) return item.newObj

    const newObj = Array.isArray(obj) ? [] : {}
    cache.push({
      origin: obj,
      newObj
    })
    Object.keys(obj).forEach(key => {
      if (typeof obj[key] == "object") {
        newObj[key] = this.deepCopy(obj[key], cache)
      } else {
        newObj[key] = obj[key]
      }
    });
    return newObj
  }