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

DA.*_*DA. 91 javascript

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

例如:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)
Run Code Online (Sandbox Code Playgroud)

将javascript测试所有这3个条件,或者在看到b不等于1之后,因此是假的,它会退出语句吗?

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

附录:更多的好奇心,这个的正确用语是什么?我注意到你们很多人都使用"短路"一词.还有,有些语言会这样做而其他语言不这样做吗?

Ano*_*on. 139

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

类似地,||如果左条件为真,则操作员短路.

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

  • 这种情况不一定总是与性能有关.有时您可能正在执行空检查并说明如果您的空检查是条件a然后您尝试执行(b ==值+ 1)进行第二次检查,如果条件被检查,则所有三个条件都会出错. (21认同)
  • 如果您希望它执行布尔语句的所有部分,您可以使用&和| for和and或reprepectively (5认同)
  • 实际上,短路与性能无关.然而,最初的问题是从绩效角度提出要求. (3认同)

Bra*_*rad 13

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

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

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

if(takesSeconds()&& takeMinutes())

好多了

if(takesMinutes()&& takeSeconds())

如果两者同样可能返回假.


小智 10

这就是你可以用javascript代码做的原因

var x = x || 2;
Run Code Online (Sandbox Code Playgroud)

这意味着如果x未定义或者为"false",则默认值为2.

  • 即使JS不支持短路评估,这也可以工作. (3认同)
  • 这相当于三元吗? (2认同)

ivc*_*ela 10

如果有人在想,如果有一种方法来强制评估的所有条件,在某些情况下,位运算符&|可用于

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up
Run Code Online (Sandbox Code Playgroud)

应使用这些真的很用心,因为位运算符是对他们的操作数的单位,并且不能总是作为"非短路"版本,算术运算符&&||

例:

-2147483648 && 1 = 1 
Run Code Online (Sandbox Code Playgroud)

-2147483648 & 1 = 0
Run Code Online (Sandbox Code Playgroud)

希望它能帮助到达这里寻找类似信息的人(像我一样)并感谢@Max进行更正和反例


alb*_*ein 7

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

javascript: alert (false && alert("A") && false);
Run Code Online (Sandbox Code Playgroud)