JS对象深拷贝

项目开发中,我们可能会遇到这种情况:
我有一个对象,我想copy一个相同的对象出来,然后用copy的那个对象进行值的变化。
eg:

    var people={
        name:"John",
        sex:"male"
    };
    var otherPeople=people;
    console.log(people);
    console.log(otherPeople);

运行结果:与原始对象相同

确实是得到了一个与原始对象相同的对象。


现在,我要对我复制的对象进行值的改变,看看会有怎样的事情发生。

    var people={
        name:"John",
        sex:"male"
    };
    var otherPeople=people;
    console.log(people);    //这是赋值前的原始对象
    otherPeople.name="Bob"; //对子对象的name属性进行重新复制
    console.log(people);    //这是原始对象
    console.log(otherPeople);//这是子对象

运行结果:这里写图片描述

奇怪的事情发生了,我的原始对象的name属性明明叫”John”,为什么在我重新给子对象进行赋值时它的对应属性也变成了”Bob”!这是怎么回事?

这是因为子对象获得的只是一个内存地址,而不是真正拷贝,这个内存地址指向的是原始对象,所以,只要对子对象进行修改就相当于对原始对象进行了修改。意思就是本来就是同一个东西,只是给他换了一个名字而已。

以上操作还有一个名称,叫做:浅拷贝


怎样才能实现我想要的效果呢?

答案就是:深拷贝!
用到JS的序列化就可以实现!直接上例子!
eg:

    var people={
        name:"John",
        sex:"male"
    };
    var s=JSON.stringify(people); //将people序列化并赋值给s,此时s是字符串
    var o=JSON.parse(s); //将s还原成对象并赋值给o
    console.log(people);
    console.log(o);

运行结果:这里写图片描述

可以看到两个对象是一样的,那如果我再给子对象重新赋值呢,原始对象会改变吗?我们试一试。

    var people={
        name:"John",
        sex:"male"
    };
    var s=JSON.stringify(people); //将people序列化并赋值给s,此时s是字符串
    var o=JSON.parse(s); //将s还原成对象并赋值给o
    console.log(people); //原始对象
    o.name="Bob";
    console.log(people); //子对象赋值后的原始对象
    console.log(o); //赋值后的子对象

运行结果:这里写图片描述

可以看到,原始对象并没有改变!还是”John”,子对象已经变成了“Bob”!我们想要的效果就达到啦!!!

当然,网上还有很多方法可以实现深拷贝,但是个人感觉比较繁琐,就不多赘述了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值