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={n:2}
    这会更改a的值,因此内存引用会因赋值而更改

  • a.x=a
    a现在指向新的内存引用,而
    a.x
    仍然指向旧引用(因为它是在右侧表达式之前计算的)


但是
b.x
不是
未定义的
@Pointy你能解释一下我哪里弄错了吗?我想自己更正一下,关键是在
a.x=a={n:2}
中,lref
a.x
是在最左边的
=
的右侧计算之前计算的。因此,
a
更改的右侧的“内存位置”发生在
a
更改之前。因此,尽管它仍然表示
a.x
它有效地引用
b.x
,因为be是唯一剩余的对
a
@Pointy oh值的引用,感谢您了解到了一些新的信息:)