javascript - foo.x 的输出是什么

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

但不是,它是undefined?我很困惑,正在寻找解释。

最佳答案

这是预期的行为。查看specification :

Simple Assignment ( = )

The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:

  1. Let lref be the result of evaluating LeftHandSideExpression.
  2. Let rref be the result of evaluating AssignmentExpression.
  3. Let rval be GetValue(rref).
  4. Throw a SyntaxError exception if (...unimportant)
  5. Call PutValue(lref, rval).
  6. 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/

相关文章:

javascript - 找不到在 div 中创建的 Canvas 元素

javascript - 附加 HTML 和 PHP 代码

c - 递增计数器时未使用表达式结果

c++ - Turbo C++ 和 GCC(在 Windows 上使用代码块)以不同方式评估相同的三元表达式

javascript - OOP 语言中的变量重新分配

Javascript 或表达式 : return Operand that is *not* NaN

javascript - 使用 grunt 动态归档名称

javascript - 显示 JSON 中的图像

javascript - AJAX 请求检索 XML 输出并在大小写重定向...但它不重定向

C++ 多次转发一个引用 : first copy and then move