我看到别的地方说,
X和; foo();
等于
if(x){
foo();
}
我测试了它,他们真的做了同样的事情。
但是为什么呢? x&&>到底是什么 foo()
?
AND和OR运算符都可以快捷方式。
因此&&
仅在第一个表达式为真(更确切地说是类真)的情况下才尝试第二个表达式。 第二个操作所做的事情(无论foo()
的内容如何)并不重要,因为除非第一个表达式的计算结果是真实的,否则它不会被执行。 如果它是真实的,那么它将被执行以尝试第二个测试。
相反,如果语句中的第一个表达式为true,则不会触及第二个表达式。 这样做是因为已经可以对整个语句进行求值,无论第二个表达式的结果如何,该语句都将导致true,因此它将被忽略而保持不执行。
当然,在使用这样的快捷方式时要注意的情况是,在运算符中,定义的变量仍然计算为假值(例如0
)和真实值(例如'zero'
)。
这就是所谓的短路评估。
在这种情况下,如果x
为False,则不需要计算foo()
(&&
的结果将始终为False); 如果x
为True,则确实需要对其进行求值(即使结果被扔掉)。
不完全等价。 第一个是一个可以使用返回值的表达式; 第二个是声明。
如果您对返回值(即x
和foo()
是否计算为truthy值的信息)不感兴趣,则它们是等价的,但通常情况下,只有当您希望将其用作布尔表达式时,才应该使用布尔逻辑版本,例如:
if (x && foo()) {
do_stuff();
}
如果您只对有条件地运行foo()
感兴趣(当x为truthy时),则首选第二种形式,因为它更清楚地表达了意图。
人们可能更喜欢布尔逻辑版本的一个原因可能是javascript受到一个不寻常的限制:源代码大小(越冗长的源代码意味着使用越多的带宽); 由于布尔逻辑版本使用更少的字符,因此它的带宽效率更高。 在大多数情况下,我还是喜欢更详细的版本,除非经常使用这个脚本--对于像jQuery这样的库,使用这样的优化是完全合理的,但在大多数其他情况下却并非如此。