答案 0 :(得分:67)
AND和OR运算符都可以快捷方式。
所以如果第一个表达式为真,&&
只会尝试第二个表达式(更像是真实的)。第二个操作确实存在的事实(无论foo()
的内容是什么)都无关紧要,因为它没有被执行,除非第一个表达式评估为真实的东西。如果它是真的,那么将执行以尝试第二次测试。
相反,如果||
语句中的第一个表达式为真,则第二个表达式不会被触及。这样做是因为整个语句已经可以被评估,无论第二个表达式的结果如何,语句都会返回true,因此它将被忽略并保持不执行状态。
当使用这样的快捷方式时要注意的情况当然是运营商的情况,其中定义的变量仍然评估为虚假值(例如0
)和真正的值(例如'zero'
)。
答案 1 :(得分:24)
在这种情况下,如果x
为False,则不需要评估foo()
(&&
的结果将始终为False);如果x
为True,则需要对其进行评估(即使结果被丢弃)。
答案 2 :(得分:8)
这并不完全等同。第一个是带有可以使用的返回值的表达式;第二个是声明。
如果你对返回值不感兴趣(也就是x
和foo()
都评估为真值的信息),它们是等价的,但通常你应该使用布尔值-logic version仅在您想将其用作布尔表达式时,例如:
if (x && foo()) {
do_stuff();
}
如果您只对有条件地运行foo()
感兴趣(当x是真实的时候),则第二种形式是首选,因为它更清楚地表达了意图。
人们可能更喜欢布尔逻辑版本的原因可能是javascript受到一个不寻常的限制:源代码大小(更详细的源代码意味着使用更多的带宽);由于布尔逻辑版本使用较少的字符,因此带宽效率更高。我仍然更喜欢更冗长的版本,除非有问题的脚本被大量使用 - 对于像jQuery这样的库,使用这样的优化是完全合理的,但在大多数其他情况下它不是。
答案 3 :(得分:3)
在javascript中,&&
运算符从左到右计算并返回最右边的操作的值。如果第一个条件的计算结果为false,则不会计算第二个条件。所以它的简写是“如果某些东西不是空的或未定义的,那就做点什么”
答案 4 :(得分:2)
短路。
&&
运算符的工作方式如下:它在两侧都是逻辑或两个操作数。如果左侧具有非零值,则评估右侧以确定真值。如果左侧是零,那么无论右侧是什么,表达式将评估为0,因此右侧是未评估。实际上,如果x
非零,则仅调用foo
,如果x
为0,则不会调用foo
,因此,它的工作方式类似{ {1}}在这种情况下。