Javascript foo.x的输出是什么

Javascript foo.x的输出是什么,javascript,operator-precedence,Javascript,Operator Precedence,foo.x的输出是什么。 我的想法是从右到左评价 所以它等于 var foo = {n: 1}; var bar = foo; foo.x = foo = {n: 2}; 就这样吧 foo = {n:2}; foo.x = foo 但它不是,它是未定义的?我感到困惑,正在寻找解释。这是预期的行为。见: 简单赋值(=) 生产AssignmentExpression:LeftHandSideExpression=AssignmentExpression的计算如下: 让lref作为计算LeftHa

foo.x的输出是什么。 我的想法是从右到左评价 所以它等于

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
就这样吧

foo = {n:2};
foo.x = foo

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

这是预期的行为。见:

简单赋值(=)

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

  • 让lref作为计算LeftHandSideExpression的结果
  • 设rref为赋值表达式求值的结果
  • 设rval为GetValue(rref)
  • 如果(…不重要),则引发SyntaxError异常
  • 调用PutValue(lref,rval)
  • 返回rval
  • 简而言之,当解释器看到
    x=
    x.prop=
    时,它首先确定要分配给什么,即LeftHandSide表达式。然后,在对右侧(AssignmentExpression)求值后,它将该值赋给最初标识为LeftHandSideExpression的对象。所以,用

    {
        n: 1
        x: {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};
    控制台日志(bar)
    
    foo.x = foo = {n: 2};