利用WeakMap、递归实现对象深拷贝。解决拷贝对象环引用爆栈问题

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)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值