JavaScript 运算符优先级、赋值和增量?

标签 javascript operator-precedence assignment-operator order-of-execution prefix-operator

在 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++ii 的起始值(结果为 3 * (6 + 4))。但我想知道,如果是这样的话,为什么 ++ii+=3 在分配给 i< 时没有产生副作用 在另一个执行之前发生?

最佳答案

评论中的讨论摘要:

简化示例:

let i = 1
let j = i += 3 + ++i;
console.log(j); //prints 6

i += 3+++ii += (3+++i) 相同,而不是 (i += 3) + (++i)

ECMAScript specification我们可以看到左侧表达式首先被求值

  1. Let lref be ? Evaluation of LeftHandSideExpression.

然后在步骤7中进行右侧计算

  1. 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/

相关文章:

javascript - 使用 Jasmine 测试超时的 JS 回调

Javascript 嵌套函数初始化

c++ - 关于运算符 -> 和 () 的评估顺序

c - 取消引用指向结构指针的指针

c - 想知道这个表达式是如何工作的吗?

scala - Scala 分配评估 Unit 而不是分配的值的动机是什么?

c++ - 在 C++ 中使用赋值运算符重载将类对象的数据复制到另一个类对象时出错

javascript - MeteorJS 从前一个函数中检索 JS 中的结果?

javascript - 当页面包含 iframe 时,Wicket 无法重新加载页面 onSubmit

c++ - C++中的重载赋值运算符