我正在查看here
的摘录var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
当我记录foo.x时,它表示未定义。 为什么会这样?我预计它会是{n:2}
答案 0 :(得分:0)
这些值是从左到右分配的,所以这就是:
expected_c
导致foo为foo.x = {n: 2};
然后foo被分配了一个新值
{n: 1, x: {n: 2}}
将其覆盖为foo = {n: 2};
。
答案 1 :(得分:0)
在两个分配之前评估foo.x
的值,因此它引用旧x
对象的foo
属性。此行为由12.14.4运行时语义定义:评估(ES6,latest draft),它告诉我们必须在赋值运算符的右侧(赋值)之前计算赋值运算符(赋值目标)的左侧)。
所以这三个结果相同:
var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
console.log(foo, bar)
var foo = {n: 1};
var bar = foo;
bar.x = foo = {n: 2};
console.log(foo, bar)
var foo = {n: 1};
var bar = foo;
foo.x = (foo = {n: 2});
console.log(foo, bar)