在 JS 中使用双括号的运算符优先级
Operator Precedence using double brackets in JS
我得到了这个代码:
let x = -2;
let ex = ((x += 10) > ++x) * 2;
console.log(ex);
想弄清楚为什么这里控制台的输出是0,而我认为应该是2?这是我背后的推理:
当我引用MDN中的优先顺序时,我也需要在这里考虑双括号。这意味着这就是我对我的行动进行优先排序的方式:
+=
(在双括号中)//我得到一个值 8
++
(根据全局括号中第二高的优先级)//我得到 -1
>
(第三优先级)//此时我将 8 与 -1 进行比较(8 > -1)= true,这意味着值现在变为 1
*
(最后一个)// 1 * 2 = 2
以上是我自己的思考过程。你能解释一下为什么我最后应该得到 0 吗?直观上,就是括号中的布尔值需要为false
,才能转换为0
。然后 0 * 2 = 0
.
谢谢。
如果你一次看一个表达式,它是有道理的:
let x = -2;
// x = -2
let ex = (
( x+= 10)
// x = 8 (which is what this expression returns)
>
++x
// x = 9 (which is what this expression returns)
) * 2:
// In other words:
let ex = (8 > 9) * 2;
// which results in 0
运算符优先级很重要,是的,但这并不意味着 VM 会突然预先计算 >
右侧的表达式。在评估二元运算符表达式时,它总是先评估左侧,然后评估右侧。 (除了 &&
可能会跳过右侧).
我得到了这个代码:
let x = -2;
let ex = ((x += 10) > ++x) * 2;
console.log(ex);
想弄清楚为什么这里控制台的输出是0,而我认为应该是2?这是我背后的推理:
当我引用MDN中的优先顺序时,我也需要在这里考虑双括号。这意味着这就是我对我的行动进行优先排序的方式:
+=
(在双括号中)//我得到一个值 8++
(根据全局括号中第二高的优先级)//我得到 -1>
(第三优先级)//此时我将 8 与 -1 进行比较(8 > -1)= true,这意味着值现在变为 1*
(最后一个)// 1 * 2 = 2
以上是我自己的思考过程。你能解释一下为什么我最后应该得到 0 吗?直观上,就是括号中的布尔值需要为false
,才能转换为0
。然后 0 * 2 = 0
.
谢谢。
如果你一次看一个表达式,它是有道理的:
let x = -2;
// x = -2
let ex = (
( x+= 10)
// x = 8 (which is what this expression returns)
>
++x
// x = 9 (which is what this expression returns)
) * 2:
// In other words:
let ex = (8 > 9) * 2;
// which results in 0
运算符优先级很重要,是的,但这并不意味着 VM 会突然预先计算 >
右侧的表达式。在评估二元运算符表达式时,它总是先评估左侧,然后评估右侧。 (除了 &&
可能会跳过右侧).