gpt4 book ai didi

JavaScript 有条件地没有像我期望的那样短路

转载 作者:行者123 更新时间:2023-11-29 17:01:40 26 4
gpt4 key购买 nike

我是一名经验丰富的开发人员,但我刚刚遇到了一个问题,我花了一段时间才弄明白,我正在寻找解释。我依赖于短路并且花费了比我愿意承认调试更多的时间。如果这属于另一个 Stack Exchange 网站,请告知。

我希望以下计算结果为 false,但它通过了:

(false && true || true) => true

就好像它被解释成这样:

((false && true) || true) => true

...但解决方案是这样的:

(false && (true || true)) => false

为什么第一个例子中的false不会短路操作呢?是否存在某种我不知道的前瞻性?


解决方案摘要:对于那些(像我一样)从来不知道条件运算符与数学运算符具有相似优先级的人 - 隐含括号的相同概念适用:

3 * 2 + 1 => (3 * 2) + 1 => 7
false && true || true => (false && true) || true => true

最佳答案

逻辑与 (&&) 的优先级高于逻辑或 (||)。

您可以通过添加示例中使用的括号来解决问题。

x && (y || z);

但是,使用显式的 if 语句会更具可读性:

if (x && y) {
z;
}

Here's a reference chart for operator precedence in JS . (参见#13 和#14。)

如果您很难理解优先级,请尝试用 * 代替 &&,用 + 代替 ||:

x * y + z;

显然,按照操作顺序,x * y 将首先执行。因此,如果您想先执行 y + z,则可以使用括号。

短路与语法无关。这只是 bool 运算符的一个怪癖。所以不要把它想成

I always thought that the first failed condition short circuits the operation and further evaluation stops.

短路不会调用某种退出整个操作的“中止”函数。只是 bool 运算符将忽略它们的第二个参数(a && b 中的 b),如果它已经可以确定最终结果是什么的话。 (例如,false && (anything) 始终为 false,因此 && 是惰性的,不会计算第二个参数。)

I still don't get how false && (anything) is always false but false && (anything) || somethingelse can be true.

好的,所以应用优先规则,我们得到:

(false && anything) || somethingelse

因此,首先评估&&。因为它是懒惰的,所以它看到 false 并立即返回 false:

(false) || somethingelse // `anything' is not evaluated

现在轮到|| 来评估了。它看到&&刚刚返回的false,不能短路,因为false || true 可能仍然是 true。因此它必须评估 somethingelse 以获得最终结果。

因此,代码 if((false && anything) || somethingelse) 本质上等同于 if (somethingelse)

关于JavaScript 有条件地没有像我期望的那样短路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26919296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com