使用 Object.assign() 进行多对象层级深拷贝得解决方案

           var testA = {
                x: 1,
                y: { z: 1, g: 2 }
            };
            var testB = {};
            Object.assign(testB, testA);
            testA.y.z = 22;
            console.log(testB);//  打印结果  testB.y.z =22

如上代码,如果想用Object.assign() 进行深拷贝是做不到的,官方文档如下:

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
但是 因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。

还有帖子说 用Json 序列化和反序列化 就可以做到,但是下面得代码你试试

var testA={
      x:1,
      y:{z:1,g:2}
      h:(obj)=>{
        console.log(obj);
     }
}

//如上代码拷贝出来会变成如下这个样子

{
    x:1,
    y:{z:1,g:2}
}

//h 不见鸟,为咩呢?因为Json 格式受限.  不能将方法反序列化.

但是呢,终极解决方案如下:

        function DeepCopy(object) {
            let resultObject = {};
            for (let obj in object) {
                if (typeof (object[obj]) == "object" && !Array.isArray(object[obj])) {
                    let x = {}
                    x[obj] = DeepCopy(object[obj])
                    Object.assign(resultObject, x);
                } else {
                    let x = {};
                    x[obj] = object[obj];
                    Object.assign(resultObject, x);
                }
            }
            return resultObject;
        }

自己去测试吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值