function checktype(obj){ //检查对象类型
return Object.prototype.toString.call(obj).slice(8,-1)
}
function depCopy(target,hash=new WeakMap()){ //hash 作为一个检查器,避免对象深拷贝中出现环引用,导致爆栈。
let type = checktype(target)
let result = null
if(type=="Object"){
result = {}
}else if(type=="Array"){
result = []
}else{
return target
}
if(hash.has(target)){ //检查是有存在相同的对象在之前拷贝过,有则返回之前拷贝后存于hash中的对象
return hash.get(target)
}
hash.set(target,result) //备份存在hash中,result目前是空对象、数组。后面会对属性进行追加,这里存的值是对象的栈
for(let i in target){
if(checktype(target[i])=="Object"||checktype(target[i])=="Array"){
result[i]= depCopy(target[i],hash)//属性值是对象,进行递归深拷贝
}else{
result[i]= target[i]//其他类型直接拷贝
}
}
return result
}
var b={gg:123}
var a={
c:{
k:1,
k2:2
},
d:{
d1:[1,2],
d2:b,
d3:{
f1:'kkk'
}
}
}
b.ff = a
let cop = depCopy(a)
利用WeakMap、递归实现对象深拷贝。解决拷贝对象环引用爆栈问题
于 2020-05-08 11:35:41 首次发布