Why actual object updates with new values if I update reference variables In JavaScript?
假设我有一个对象名x,其值为x = { a: 'abc', b: 'jkl' },
现在我将这个对象x分配给var y = x的新局部变量y。
当var y值随新值y.a = 'pqr', y.b = 'xyz'变化时,var x对象自动更新为var y的新值{ a: 'pqr', b: 'xyz' }。
这是一个很好的场景,但在某些情况下,我想防止这种情况发生。我怎样才能做到这一点?
你可以在这里找到这个的密码
- "var x对象用新值自动更新"不,它没有。
- 我不认为var x会自动更新,在这种情况下,请共享一个片段来复制这个!
- 不要混淆y = {a: 'pqr'}和y['a'] = 'pqr'。很不一样,这两个。
- @Robbycornelissen为什么,是的,事实上确实如此,而且有非常好的重复目标来反对这种行为。可悲的是,你们都不清楚地把它关了。如果重新打开,这里有一个副本:stackoverflow.com/questions/18359093/…或stackoverflow.com/q/728360/576767。有一个2.5公里以上的赞成票问题可以解释这种行为,你怎么能说它没有发生?
- @F&233;lixgagnon grenier在我发表评论很久之后,问题就被编辑了。查看原始文件的编辑历史记录。
- @Robbycornelissen说得对。那我们就重新开始吧。
- @F&233;lixgagnon grenier为什么?你刚才指出已经有两个副本了。
- @Robbycornelissen,这样我们就可以将它们作为副本关闭。这不是一个不清楚的问题。此外,原来的问题问得非常相同,修订版加了粗体和代码样本,但问题已经存在了。
- @F&233;lixgagnon grenier也可以投票删除它。原来的问题不一样。原来的完全将一个新的对象分配给y,然后声称这会影响x。
在所描述的场景中,y得到一个新对象,x仍然存在。
不同的是,如果更新x或y的某些属性,那么这两个属性都会使用更新引用同一个对象。
1 2 3 4 5 6 7
| var x = { a: 'abc', b: 'jkl' };
y = x;
y = { a: 'pqr', b: 'xyz' };
console.log(x);
console.log(y); |
有两种方法可以防止这种情况:
1-Object.assign号:
1 2 3 4 5
| var x = { a: 'abc', b: 'jkl' }
var y = Object.assign({}, x);
y.a = 'modified';
console.log('x: ', x);
console.log('y: ', y); |
2-Spread operator号:
1 2 3 4 5
| var x = { a: 'abc', b: 'jkl' }
var y = { ...x };
y.a = 'modified';
console.log('x: ', x);
console.log('y: ', y); |
- 这只涉及一个层面。当你尝试这个然后做y.one.two的时候,你会突变x,因为y.one仍然是x.one的参考。