实现一个深拷贝

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)

你可能感兴趣的:(实现一个深拷贝)