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