什么是"x && foo()"?

Der*_*會功夫 43 javascript conditional and-operator

我看到其他地方说,

x && foo();

等于

if(x){
    foo();
}
Run Code Online (Sandbox Code Playgroud)

我测试了它,他们真的做了同样的事情.
但为什么?到底是x && foo()什么?

Kzq*_*qai 69

AND和OR运算符都可以快捷方式.

因此,&&如果第一个表达式为真,则仅尝试第二个表达式(更像是真实的).第二个操作确实填充的事实(无论内容是什么foo())都无关紧要,因为除非第一个表达式评估为真实的东西,否则它不会被执行.如果它是真的,那么它将被执行以便尝试第二次测试.

相反,如果||语句中的第一个表达式为真,则第二个表达式不会被触及.这样做是因为整个语句已经可以被评估,无论第二个表达式的结果如何,语句都会返回true,因此它将被忽略并保持不执行状态.

当然,在使用这样的快捷方式时需要注意的情况是运营商的情况,其中定义的变量仍然评估为虚假值(例如0)和真实值(例如'zero').

  • @John:这个问题指的是javascript ... (5认同)
  • 检查语言的语法规范,以确保您的语言遵循相同的快捷方式执行终止规则.存在违反它的遗留语言. (4认同)

Joh*_*web 24

这被称为短路评估.

在这种情况下,如果x为False,则foo()不需要进行求值(结果&&总是为False); 如果x为True,则需要进行评估(即使结果被丢弃).

  • @Tchalvak:它确实......如果你知道该找什么! (4认同)

tda*_*ers 8

它并不完全等同.第一个是带有可以使用的返回值的表达式; 第二个是声明.

如果你对返回值不感兴趣(也就是两个信息都不感兴趣x并且foo()评估为真值),它们是等价的,但通常只有当你想将它用作布尔值时才应该使用布尔逻辑版本表达,例如:

if (x && foo()) {
    do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

如果你只对foo()有条件的跑步感兴趣(当x是真实的时候),第二种形式是首选,因为它更清楚地表达了意图.

人们可能更喜欢布尔逻辑版本的原因可能是javascript受到一个不寻常的限制:源代码大小(更详细的源代码意味着使用更多的带宽); 由于布尔逻辑版本使用较少的字符,因此带宽效率更高.我仍然更喜欢大多数时候更冗长的版本,除非有问题的脚本被大量使用 - 对于像jQuery这样的库,使用这样的优化是完全合理的,但在大多数其他情况下并非如此.