您的位置:首页 > Web前端 > JavaScript

JS对象深拷贝

2017-10-09 18:01 495 查看
项目开发中,我们可能会遇到这种情况:

我有一个对象,我想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”!我们想要的效果就达到啦!!!

当然,网上还有很多方法可以实现深拷贝,但是个人感觉比较繁琐,就不多赘述了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: