具有多个条件的 javascript if 语句是否会测试所有条件?

IT技术 javascript
2021-01-20 23:48:04

在 javascript 中,当使用带有多个条件的 if 语句进行测试时,javascript 是否会测试它们,或者如果它已经是假的,它会在测试它们之前保释吗?

例如:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

javascript 是否会针对所有 3 个条件进行测试,或者在看到 b 不等于 1 并且因此为 false 之后,它会退出语句吗?

我是从性能的角度来问的。例如,如果我正在测试 3 个复杂的 jQuery 选择器,我宁愿不让 jQuery 遍历 DOM 3 次,如果通过第一个选择器很明显它将返回 FALSE。(在这种情况下,嵌套 3 个 if 语句会更有意义)。

附录:更令人好奇的是,这个的正确术语是什么?我注意到你们中的许多人使用“短路”这个词。另外,有些语言会这样做而其他语言不会吗?

6个回答

&&运营商“短路” -也就是说,如果左边的条件是假的,它不打扰评估是正确的。

类似地,||如果左边的条件为真运算符就会短路。

编辑:不过,在您进行基准测试并确定这是一个问题之前,您不应该担心性能。过早的微优化是可维护性的祸根。

这种情况不一定总是与性能有关。有时您可能会进行空检查并说您的空检查是否为条件 a,然后您尝试执行 (b == value + 1) 进行第二次检查,如果检查了所有三个条件,您将收到错误。
2021-03-14 23:48:04
非常好。进行这种微优化(除其他外)可以在滚动事件循环中产生很大的影响,比如多个元素的视差计算,甚至粘条。以这个例子为例:if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop)第二个条件是一个更昂贵的计算,第一个只是一个布尔值。:)
2021-03-25 23:48:04
事实上,短路与性能无关。然而,最初的问题是从性能的角度提出的。
2021-03-28 23:48:04
如果您确实希望它执行布尔语句的所有部分,您可以使用 & 和 | 分别为和或
2021-04-11 23:48:04
优秀的答案(技术部分和管理问题)。谢谢!
2021-04-13 23:48:04

从性能的角度来看,这不是微优化。

如果我们有 3 个布尔变量,a, b, c 就是一个微优化。

如果我们调用 3 个返回布尔变量的函数,每个函数可能需要很长时间,不仅要知道这个短路,重要的是要知道它的顺序。例如:

if (takesSeconds() && takesMinutes())

if (takesMinutes() && takesSeconds())

如果两者都同样有可能返回 false。

这就是为什么你可以在 javascript 代码中做这样的事情

var x = x || 2;

这意味着如果 x 未定义或否则为“假”,则默认值为 2。

即使 JS 不支持短路评估,这也可以工作。
2021-03-14 23:48:04
这相当于三元吗?
2021-04-12 23:48:04

如果有人想知道是否有办法强制评估所有条件,在某些情况下可以使用按位运算符&|

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

应使用这些真的很用心,因为位运算符是对他们的操作数的单位工程和算术运算符不能总是充当“非短路”的版本&&||

例子:

-2147483648 && 1 = 1 

-2147483648 & 1 = 0

希望它可以帮助到这里寻找这样的信息的人(像我一样)并感谢@Max 的更正和反例

强制评估的更简单更好的方法是将结果保存在变量中,然后针对变量进行测试,即: var a=false; var b=check(); alert(a && b);
2021-03-14 23:48:04
这个答案是错误的。& 和 | 是按位运算符,它们不是“&& 和 ||”的“非短路版本”。按位运算符是算术运算符,适用于其操作数的单个位。示例:-2147483648 && 1 = 1 但 -2147483648 & 1 = 0。更多信息在这里:en.wikipedia.org/wiki/Bitwise_operation
2021-03-16 23:48:04
@DJDaveMark 抱歉,我无法让您的false && (alert(""))解决方案起作用:/
2021-03-24 23:48:04
@Max 实际上我不知道这一点,自从我学习 C 以来,我一直在使用它(我现在称之为“技巧”)。幸运的是,这种会破坏我的代码的输入从未出现过。我更正了我的答案,我欠你
2021-03-27 23:48:04
@ivcandela 我也不能。如果我不在手机上,我会第一次测试它;o) 可惜你不能编辑评论。我刚刚删除了它并在下面添加了另一个
2021-03-27 23:48:04

如果第一个条件为真,它只会测试所有条件,请自行测试:

javascript: alert (false && alert("A") && false);