提问人:mishar 提问时间:6/22/2023 最后编辑:mplungjanmishar 更新时间:6/22/2023 访问量:51
JavaScript 运算符优先级、赋值和递增?
JavaScript Operator Precedence, Assignment, and Increment?
问:
在 JavaScript (JS) 中,具有比 或 更高的优先级。为了更好地理解 JS 中的运算符执行顺序,我希望看到为什么以下代码片段会导致被打印?++
+=
=
30
let i = 1
let j = (i+=2) * (i+=3 + ++i);
console.log(j); //prints 30
幼稚地认为,似乎 首先执行,导致 ,然后被用作 和 的起始值(导致 )。但我想知道,如果是这样的话,为什么 or 在另一个执行之前分配没有副作用?i+=2
3 * (i+=3 + ++i)
3
i
i+=3
++i
3 * (6 + 4)
++i
i+=3
i
答:
2赞
Konrad
#1
评论中的讨论摘要:
简化示例:
let i = 1
let j = i += 3 + ++i;
console.log(j); //prints 6
i += 3 + ++i
是相同的,而不是i += (3 + ++i)
(i += 3) + (++i)
在 ECMAScript 规范中,我们可以读到首先计算左侧表达式
- 让 lref 成为 ?LeftHandSideExpression 的计算结果。
然后在步骤中进行右侧计算后7
- 让 r 是 ?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
评论
1赞
Fraŋkini
6/22/2023
要考虑的另一件事是第一部分的括号。我不认为混乱只在于第二部分,而在于整个表达。例如,如果你做原始的,它的结果是 30,但结果是 13(i+=2) * (i+=3 + ++i)
i+=2 * (i+=3 + ++i)
评论
(i+=3 + ++i)
与不相同i += (3 + ++i)
(i+=3) + (++i)