JS对象深拷贝
2017-10-09 18:01
495 查看
项目开发中,我们可能会遇到这种情况:
我有一个对象,我想copy一个相同的对象出来,然后用copy的那个对象进行值的变化。
eg:
运行结果:
确实是得到了一个与原始对象相同的对象。
现在,我要对我复制的对象进行值的改变,看看会有怎样的事情发生。
运行结果:
奇怪的事情发生了,我的原始对象的name属性明明叫”John”,为什么在我重新给子对象进行赋值时它的对应属性也变成了”Bob”!这是怎么回事?
这是因为子对象获得的只是一个内存地址,而不是真正拷贝,这个内存地址指向的是原始对象,所以,只要对子对象进行修改就相当于对原始对象进行了修改。意思就是本来就是同一个东西,只是给他换了一个名字而已。
以上操作还有一个名称,叫做:浅拷贝
用到JS的序列化就可以实现!直接上例子!
eg:
运行结果:
可以看到两个对象是一样的,那如果我再给子对象重新赋值呢,原始对象会改变吗?我们试一试。
运行结果:
可以看到,原始对象并没有改变!还是”John”,子对象已经变成了“Bob”!我们想要的效果就达到啦!!!
当然,网上还有很多方法可以实现深拷贝,但是个人感觉比较繁琐,就不多赘述了
我有一个对象,我想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”!我们想要的效果就达到啦!!!
当然,网上还有很多方法可以实现深拷贝,但是个人感觉比较繁琐,就不多赘述了
相关文章推荐
- js实现数组和对象的深浅拷贝
- JS对象浅拷贝与深拷贝问题实践
- JS中深拷贝数组、对象、对象数组方法总结
- js 对象浅拷贝和深拷贝
- js对象深拷贝与浅拷贝
- js中实现数组与对象的深拷贝
- js对象的拷贝
- angular2使用lodash深拷贝js对象
- js对象深拷贝和对象扩展
- js对象浅拷贝和深拷贝详解
- js 数组的深浅拷贝 js对象的深浅拷贝
- js中对象的拷贝(复制)
- js 对象浅拷贝、深拷贝
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
- jqgrid获取原始数据,js对象拷贝
- 超实用的JavaScript代码段 Item8 -- js对象的(深)拷贝
- js对象深度拷贝、Object.assign()、Object.assign()复制非对象、Object.assign()浅拷贝
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
- JS对象的深拷贝
- js 对象的深拷贝