Der*_*會功夫 43 javascript conditional and-operator
我看到其他地方说,
x && foo();
等于
if(x){
foo();
}
Run Code Online (Sandbox Code Playgroud)
我测试了它,他们真的做了同样的事情.
但为什么?到底是x && foo()什么?
Kzq*_*qai 69
AND和OR运算符都可以快捷方式.
因此,&&如果第一个表达式为真,则仅尝试第二个表达式(更像是真实的).第二个操作确实填充的事实(无论内容是什么foo())都无关紧要,因为除非第一个表达式评估为真实的东西,否则它不会被执行.如果它是真的,那么它将被执行以便尝试第二次测试.
相反,如果||语句中的第一个表达式为真,则第二个表达式不会被触及.这样做是因为整个语句已经可以被评估,无论第二个表达式的结果如何,语句都会返回true,因此它将被忽略并保持不执行状态.
当然,在使用这样的快捷方式时需要注意的情况是运营商的情况,其中定义的变量仍然评估为虚假值(例如0)和真实值(例如'zero').
它并不完全等同.第一个是带有可以使用的返回值的表达式; 第二个是声明.
如果你对返回值不感兴趣(也就是两个信息都不感兴趣x并且foo()评估为真值),它们是等价的,但通常只有当你想将它用作布尔值时才应该使用布尔逻辑版本表达,例如:
if (x && foo()) {
do_stuff();
}
Run Code Online (Sandbox Code Playgroud)
如果你只对foo()有条件的跑步感兴趣(当x是真实的时候),第二种形式是首选,因为它更清楚地表达了意图.
人们可能更喜欢布尔逻辑版本的原因可能是javascript受到一个不寻常的限制:源代码大小(更详细的源代码意味着使用更多的带宽); 由于布尔逻辑版本使用较少的字符,因此带宽效率更高.我仍然更喜欢大多数时候更冗长的版本,除非有问题的脚本被大量使用 - 对于像jQuery这样的库,使用这样的优化是完全合理的,但在大多数其他情况下并非如此.