今天我在javascript中遇到了这个问题,不知道为什么会这样。
var a = {
prop: {
bool: true
}
};
console.log(a.prop.bool); // logs true
var b = a;
b.prop.bool = false;
console.log(a.prop.bool); // logs false ¿?
答案 0 :(得分:5)
表达式{ prop: ... }
表达式被计算一次以创建一个对象。
a
和b
都是引用到该单个对象。
请参阅What's the difference between passing by reference vs. passing by value?和http://en.wikipedia.org/wiki/Reference_(computer_science)
引用被广泛用于编程,特别是有效地将大型或可变数据作为参数传递给程序,或者在各种用途之间共享这些数据。
修改
来自下划线的 clone
做了一个浅表副本。
创建对象的浅层复制克隆。任何嵌套对象或数组都将通过引用复制,而不是重复。
要创建深层副本,最简单的方法可能是序列化和反序列化。如果a
有参考周期,这将会发生奇怪的事情。
var b = JSON.parse(JSON.stringify(a));
答案 1 :(得分:5)
您已创建对同一对象的引用。执行此操作时,变量b的任何更改都将影响存储在变量a。
中的对象您需要对对象进行“克隆”以更改它,这样您就有两个对象而不是一个有两个引用的对象。
答案 2 :(得分:3)
当你通过引用将b分配给赋值时,意味着b引用内存中的相同位置,因此当b更新并且你观察到它看起来像a也被更新。