foo.x的输出是什么

时间:2019-05-13 00:20:18

标签: javascript operator-precedence

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}
}

但是不是,它是未定义的吗?我很困惑,正在寻找解释。

1 个答案:

答案 0 :(得分:2)

这是预期的行为。参见specification

  

简单分配(=)

     

生产的AssignmentExpression:LeftHandSideExpression = AssignmentExpression的计算如下:

     
      
  1. 让lref成为评估LeftHandSideExpression的结果。
  2.   
  3. 让rref成为评估AssignmentExpression的结果。
  4.   
  5. 让rval为GetValue(rref)。
  6.   
  7. 如果(...不重要),则引发SyntaxError异常
  8.   
  9. 调用PutValue(lref,rval)。
  10.   
  11. 返回rval。
  12.   

简而言之,当解释器看到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);