Javascript 链式赋值运算符在这种情况下是如何工作的
我在某处看到了这个有点奇怪的赋值运算符链接,我一直试图理解这是怎么可能的,但我似乎无法理解它Javascript 链式赋值运算符在这种情况下是如何工作的,javascript,object,assignment-operator,Javascript,Object,Assignment Operator,我在某处看到了这个有点奇怪的赋值运算符链接,我一直试图理解这是怎么可能的,但我似乎无法理解它 var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); // undefined console.log(b.x); // {n: 2} a.x的内部参考值-分配的“目标”a.x=a-在分配发生之前计算。因此,赋值的目标是a的旧值上的“x”属性,它与b相同。a的新值没有“x”属性,因此未定义该属性。但是,赋值给了a的旧
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x); // undefined
console.log(b.x); // {n: 2}
a.x
的内部参考值-分配的“目标”a.x=a
-在分配发生之前计算。因此,赋值的目标是a
的旧值上的“x”属性,它与b
相同。a
的新值没有“x”属性,因此未定义该属性。但是,赋值给了a
的旧值一个“x”属性,它是b
的当前值
如果您喜欢“语言律师”,您可以查看=
操作符的描述及其工作原理。注意,在步骤1中,确定了称为lref的内容。这就是我在上段中提到的“target”,请注意,它发生在计算右侧“赋值表达式”之前
var a = {n: 1};
var b = a; // since a is an object b holds the reference of
a.x = a = {n: 2};
这会更改a的值,因此内存引用会因赋值而更改a={n:2}
a现在指向新的内存引用,而a.x=a
仍然指向旧引用(因为它是在右侧表达式之前计算的)a.x
b.x
不是未定义的@Pointy你能解释一下我哪里弄错了吗?我想自己更正一下,关键是在a.x=a={n:2}
中,lrefa.x
是在最左边的=
的右侧计算之前计算的。因此,a
更改的右侧的“内存位置”发生在a
更改之前。因此,尽管它仍然表示a.x
它有效地引用b.x
,因为be是唯一剩余的对a
@Pointy oh值的引用,感谢您了解到了一些新的信息:)