为什么这会在javascript中发生?

时间:2011-10-06 23:25:59

标签: javascript reference

今天我在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 ¿?

3 个答案:

答案 0 :(得分:5)

表达式{ prop: ... }表达式被计算一次以创建一个对象。

ab都是引用到该单个对象。

请参阅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也被更新。