带有多个条件的 javascript if 语句是否测试所有这些条件?

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

For example:

 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 语句更有意义)。

附录: 更多的是一个好奇,什么是正确的术语,这是什么?我注意到你们许多人使用术语“短路”。还有,是否有些语言做到了这一点,而其他语言没有呢?

114999 次浏览

&&操作符“短路”——也就是说,如果左边的条件为假,它就不会费心去计算右边的条件。

类似地,如果左边条件为真,则 ||操作符短路。

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

它在看到 b 不等于1后退出。

它短路-只有 a 和 b 将在您的例子中进行比较。

它只会测试所有的条件,如果第一个条件是真的,自己测试一下:

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

这就是为什么你可以在 javascript 代码中像

var x = x || 2;

这意味着如果 x 未定义或者是‘ false’,那么默认值是2。

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

If we have 3 Boolean variables, a, b, c that is a micro-optimization.

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

if (takesSeconds() && takesMinutes())

if (takesMinutes() && takesSeconds())

如果两者都同样可能返回假值。

另一个停止计算的原因是左边有1个或多个参数。

如果(response. authResponse & & (response. authResponse.accToken! = user.accToken)){ ... }

第二个计算依赖于第一个条件为 true,如果 response. authResponse 为 null 或未定义等,则不会抛出编译错误,因为第一个条件失败。

其他语言在早期也有这个问题,我认为这是现在构建编译器的标准方法。

如果有人想知道是否有一种方法可以实现所有条件下的 force the evaluation,可以使用 在某些情况下位运算符 &|

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

这些应该使用 really carefully,因为位运算符是算术运算符,工作在其操作数的单个位上,并且不能总是作为 &&||的“非短路”版本

例如:

-2147483648 && 1 = 1

但是

-2147483648 & 1 = 0

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

对于这个问题上的任何人困惑,因为他们没有看到短路行为时,使用 ||?操作员像这样:

x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected

it seems like the short circuit rule isn't working. Why is it evaluating the second term of the || (true ? 2 : 3) when the first is true? It turns out to be an order of operations problem because the above is the equivalent of

x = (1 || true) ? 2 : 3

第一次评估 ||,第二次评估 ?。你可能想要的是:

x = 1 || (true ? 2 : 3)

在这种情况下:

a = 1
b = 2
c = 1


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

你可使用:

if ([a, b, c].every(x => x == 1))
// do something if a, b and c are equal to 1.

如果您想知道是否至少有一个等于1,使用 some ()方法而不是 every () :

if ([a, b, c].some(x => x == 1))
// do something if a, b or c is equal to 1.

Every ()和 some ()都是数组方法。