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}
}
但不是,它是undefined?我很困惑,正在寻找解释。
最佳答案
这是预期的行为。查看specification :
Simple Assignment ( = )
The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:
- Let lref be the result of evaluating LeftHandSideExpression.
- Let rref be the result of evaluating AssignmentExpression.
- Let rval be GetValue(rref).
- Throw a SyntaxError exception if (...unimportant)
- Call PutValue(lref, rval).
- Return 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);
关于javascript - foo.x 的输出是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56104521/