为什么在javascript中会发生这种情况?

为什么在javascript中会发生这种情况?,javascript,reference,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 ¿? 表达式{prop:…}表达式计算一次以创建一个对象 a和b都是对单个对象的引用 看到和 引用在编程中被

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

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

a
b
都是对单个对象的引用

看到和

引用在编程中被广泛使用,尤其是为了高效地将大型或可变数据作为参数传递给过程,或者在各种用途之间共享此类数据

编辑

从下划线进行浅复制

创建对象的浅复制克隆。任何嵌套对象或数组都将通过引用进行复制,而不是复制

要创建深度副本,最简单的方法可能是序列化和反序列化。如果
a
有引用循环,那么这会做一些奇怪的事情

var b = JSON.parse(JSON.stringify(a));

当您将b分配给a时,分配是通过引用进行的,这意味着b引用了内存中与a相同的位置。因此,当b被更新并且您观察到a时,看起来a也被更新了。

您已经创建了对同一对象的引用。执行此操作时,变量b的任何更改都将影响存储在变量a中的对象


您需要对对象进行“克隆”以更改它,这样您就有了两个对象,而不是一个有两个引用的对象。

请注意,没有“对象b”和“对象a”,只有一个对象(并且没有名称)。@ŠimeVidas漂亮的捕捉!我已经解决了这个问题+1给你,先生。如何将b赋值为a?@Datamosh,你想创建对象的副本吗?是的,我想复制。使用下划线中的u.clone()可以得到相同的结果:(-1:您将其标记为“引用”,因此您至少清楚地知道一些关于它的信息。在web上搜索“javascript变量引用”提供了很多解释…所以这个问题没有显示出研究的努力。对不起,我真的在寻找答案,但没有找到一个像我得到的那样准确的答案。