在JavaScript语句中多次修改变量和函数参数的求值顺序

Modifying a variable more than once in a statement and order of evaluation of function arguments in JavaScript

本文关键字:参数 函数 顺序 变量 语句 JavaScript 修改      更新时间:2023-09-26

我们如何推断这些JavaScript语句并解释它们的输出?

  1. i = 1; i = i++; console.log(i); // Outputs 1 in Firefox
  2. i = 1; x = i++ + i++; console.log(i, x); // Outputs 3 3 in Firefox
  3. i = 1; console.log(i, i++); // Outputs 1 1 in Firefox

在C中,(1)和(2)的等价语句被认为调用了未定义的行为,因为我们在两个序列点之间多次修改i的值。在C语言中,(3)的等价语句被认为调用了未定义的行为,因为函数参数的求值顺序是未定义的。JavaScript的规则是什么?

根据ECMA 5.1后缀自增运算符规范,

  1. lhsLeftHandSideExpression的求值结果。
  2. oldValueToNumber(GetValue(lhs))
  3. newValueoldValue加1的结果,使用与+运算符相同的规则(见11.6.3)。
  4. 呼叫PutValue(lhs, newValue) .
  5. 返回oldValue .

根据规则,让我们计算表达式

i = i++

该值将在i中递增并设置。按照步骤4和步骤5。然后返回oldValue 1本身,并将其再次存储在i中。这就是为什么你得到1。

x = i++ + i++

相同的逻辑。i++的值为1, i的值为2。现在,计算下一个i++,它的值为2,i的值被设置为3。所以1和2的和赋值给x。这就是为什么它打印3 3

console.log(i, i++)

还是同样的逻辑。i为1,i++计算结果为1,但只设置为2。这就是为什么它打印1 1