实现一个深拷贝
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)
发表评论 (审核通过后显示评论):