实现一个深拷贝

1.如果是函数类型和普通类型直接返回原来的值。
2.如果是正则,直接返回原来的值。
3.如果是日期类型,直接返回原来的值。
4.需要新建一个WeakMap的表用来存储被拷贝过的值,并且在递归的时候传下去,这样可以避免对象引用自己造成无限递归。
5.拷贝的时候只拷贝对象的私有属性。

//deepClone
const deepClone = (value, hash = new WeakMap) => {
    if(value == null){ // 这里排除掉null 和 undefine 因为null == undefine
        return false  
    } 
    if(typeof value !== 'object') return value // 这里包含了函数类型
    if(value instanceof RegExp) return new RegExp(value)
    if(value instanceof Date) return new Date(value)
    // 根据当前属性构造一个新的实例    
    let instance = new value.constructor
     // 这里做一下防止循环引用的处理
     if(hash.has(value)){
        return hash.get(value)
    }
    hash.set(value, instance) // 已经拷贝过的存放在表里作为记录
    for (const key in value) {
        if (value.hasOwnProperty(key)) { // 只拷贝私有属性
           instance[key] = deepClone(value[key], hash) // 这里表向下传递作为记录
        }
    }
    return instance
}

// test
let obj = {
    name: 'teacc',
    age: 25,
    other:{
        a: 1
    }
}
obj.b = obj
let cloneObj = deepClone(obj)
cloneObj.other.a = 2
console.log(obj)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 浅拷贝只复制指向某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存;但深拷贝会另外创造一个一模一样的对象...
    悄敲阅读 1,266评论 0 2
  • 深拷贝与浅拷贝的区别?如何实现一个深拷贝 在回答这个问题前,我们先来回顾一下JS中两大数据类型 基本类型 Unde...
    忆当年L阅读 1,066评论 0 0
  • 深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。 代码中理解... <!DOCTYP...
    果粒橙没有粒阅读 928评论 0 1
  • 前言:js如何实现一个深拷贝 这是一个老生常谈的问题,也是在求职过程中的高频面试题,考察的知识点十分丰富,本文将对...
    丶chlorine阅读 451评论 0 2
  • 这是我第一次一个人坐在车里不愿回家,虽然家里也只有我一个人。有太多的事情、太多的心情需要平复。 像夜里孤独的...
    十九o阅读 413评论 0 0