对象的双重赋值 属性 导致未定义 属性
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 }
将一个全新的对象分配给 foo
。 x
确实分配给了一个对象,但是那个对象立即被另一个对象替换了。带有 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”键
谁能告诉我输出是如何变成 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 }
将一个全新的对象分配给 foo
。 x
确实分配给了一个对象,但是那个对象立即被另一个对象替换了。带有 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”键