对象的双重赋值 属性 导致未定义 属性

Double-assignment of an object property results in undefined property

谁能告诉我输出是如何变成 undefined 的?

var foo = {n: 2};
foo.x = foo = {n: 2};
console.log(foo.x); // undefined
foo.x = foo = { n: 2 };

foo.x引用了foo所引用对象的属性x。但是,foo = { n: 2 } 将一个全新的对象分配给 foox 确实分配给了一个对象,但是那个对象立即被另一个对象替换了。带有 x 属性 的对象不再被任何东西引用。

您可以将该行读作

foo.x = (foo = { n: 2 });

图解说明

var foo = { n: 2 };

foo.x = foo = { n: 2 };

console.log(foo.x);

我将分解每个变量的赋值和输出。

var foo = {n:2}
// foo: Object {n: 2}
// foo.x: undefined

foo.x = 3
// foo: Object {n: 2, x: 3 }
// foo.x: 3

foo.x = foo
// foo: Object {n: 2, x: Object {n:2, x: Object (recursive) } }
// foo.x: Object {n: 2, x: Object {n:2, x: Object (recursive) } }

foo.x = foo = {n: 2}
// foo: Object {n: 2}
// foo.x: undefined

如您所见,最后一行将 foo 重置为等于 {n: 2},这使得 foo.x 不存在(因为您已经覆盖了 foo 对象)

你的代码和这个完全一样,

var foo = {n:2}; // foo ==> {n:2}
foo.x = {n:2}; // foo ==> {n:2,x:{n:2}}
foo = {n:2}; // foo ==> {n:2}
console.log(foo.x); // undefined 

因为您的对象中没有“x”键