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