什么是“x&& foo()”?

时间:2011-08-07 02:32:30

标签: javascript conditional and-operator

我看到somewhere否则说,

x && foo();

等于

if(x){
    foo();
}

我对它进行了测试,他们确实做了同样的事情 但为什么?究竟是什么x && foo()

5 个答案:

答案 0 :(得分:67)

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

所以如果第一个表达式为真,&&只会尝试第二个表达式(更像是真实的)。第二个操作确实存在的事实(无论foo()的内容是什么)都无关紧要,因为它没有被执行,除非第一个表达式评估为真实的东西。如果它是真的,那么执行以尝试第二次测试。

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

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

答案 1 :(得分:24)

这称为short-circuit evaluation

在这种情况下,如果x为False,则不需要评估foo()&&的结果将始终为False);如果x为True,则需要对其进行评估(即使结果被丢弃)。

答案 2 :(得分:8)

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

如果你对返回值不感兴趣(也就是xfoo()都评估为真值的信息),它们是等价的,但通常你应该使用布尔值-logic version仅在您想将其用作布尔表达式时,例如:

if (x && foo()) {
    do_stuff();
}

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

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

答案 3 :(得分:3)

在javascript中,&&运算符从左到右计算并返回最右边的操作的值。如果第一个条件的计算结果为false,则不会计算第二个条件。所以它的简写是“如果某些东西不是空的或未定义的,那就做点什么

答案 4 :(得分:2)

短路。

&&运算符的工作方式如下:它在两侧都是逻辑或两个操作数。如果左侧具有非零值,则评估右侧以确定真值。如果左侧是零,那么无论右侧是什么,表达式将评估为0,因此右侧是评估。实际上,如果x非零,则仅调用foo,如果x为0,则不会调用foo,因此,它的工作方式类似{ {1}}在这种情况下。