var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
foo.x的输出。 我的想法是从右到左评估 所以等于
foo = {n:2};
foo.x = foo
所以会是
{
n: 1
x: {n: 2}
}
但是不是,它是未定义的吗?我很困惑,正在寻找解释。
答案 0 :(得分:2)
这是预期的行为。参见specification:
简单分配(=)
生产的AssignmentExpression:LeftHandSideExpression = AssignmentExpression的计算如下:
- 让lref成为评估LeftHandSideExpression的结果。
- 让rref成为评估AssignmentExpression的结果。
- 让rval为GetValue(rref)。
- 如果(...不重要),则引发SyntaxError异常
- 调用PutValue(lref,rval)。
- 返回rval。
简而言之,当解释器看到x = <expression>
或x.prop = <expression>
时,它首先标识要分配的内容-即LeftHandSideExpression。然后,在 对右侧(AssignmentExpression)求值后,将其分配给最初被识别为LeftHandSideExpression的值。所以,
foo.x = foo = {n: 2};
foo.x
会更改原始 foo
对象,而不是重新分配的foo = {n: 2}
对象,因此在foo.x = foo = {n: 2}
行之后,foo
指的是永不突变的新{n: 2}
。
您可以看到bar
是如何与原来的foo
引用相同的内存对象的。
var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
console.log(bar);