在 JavaScript (JS) 中,++
的优先级高于 +=
或 =
。为了更好地理解 JS 中的运算符执行顺序,我希望了解为什么以下代码片段会导致打印 30
?
let i = 1
let j = (i+=2) * (i+=3 + ++i);
console.log(j); //prints 30
天真地,看起来i+=2
先执行,结果是3 * (i+=3+++i)
,然后是3
被用作 i+=3
和 ++i
的 i
的起始值(结果为 3 * (6 + 4)
)。但我想知道,如果是这样的话,为什么 ++i
或 i+=3
在分配给 i< 时没有产生副作用
在另一个执行之前发生?
最佳答案
评论中的讨论摘要:
简化示例:
let i = 1
let j = i += 3 + ++i;
console.log(j); //prints 6
i += 3+++i
与 i += (3+++i)
相同,而不是 (i += 3) + (++i)
在 ECMAScript specification我们可以看到左侧表达式首先被求值
- Let lref be ? Evaluation of LeftHandSideExpression.
然后在步骤7
中进行右侧计算
- Let r be ? ApplyStringOrNumericBinaryOperator(lval, opText, rval).
所以 i += (3+++i)
实际上是:
let lhs = i // 1
let rhs = 3 + ++i // 3 + 2
i = lhs + rhs // 6
或者在问题中举个例子:
let lhs = i // 3
let rhs = 3 + ++i // 3 + 4
i = lhs + rhs // 10
关于JavaScript 运算符优先级、赋值和增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76526593/