提问者:小点点

什么是“x&&foo()”?


我看到别的地方说,

X和; foo();

等于

if(x){
    foo();
}

我测试了它,他们真的做了同样的事情。
但是为什么呢? x&&>到底是什么 foo()


共3个答案

匿名用户

AND和OR运算符都可以快捷方式。

因此&&仅在第一个表达式为真(更确切地说是类真)的情况下才尝试第二个表达式。 第二个操作所做的事情(无论foo()的内容如何)并不重要,因为除非第一个表达式的计算结果是真实的,否则它不会被执行。 如果它是真实的,那么它将被执行以尝试第二个测试。

相反,如果语句中的第一个表达式为true,则不会触及第二个表达式。 这样做是因为已经可以对整个语句进行求值,无论第二个表达式的结果如何,该语句都将导致true,因此它将被忽略而保持不执行。

当然,在使用这样的快捷方式时要注意的情况是,在运算符中,定义的变量仍然计算为假值(例如0)和真实值(例如'zero')。

匿名用户

这就是所谓的短路评估。

在这种情况下,如果x为False,则不需要计算foo()&&的结果将始终为False); 如果x为True,则确实需要对其进行求值(即使结果被扔掉)。

匿名用户

不完全等价。 第一个是一个可以使用返回值的表达式; 第二个是声明。

如果您对返回值(即xfoo()是否计算为truthy值的信息)不感兴趣,则它们是等价的,但通常情况下,只有当您希望将其用作布尔表达式时,才应该使用布尔逻辑版本,例如:

if (x && foo()) {
    do_stuff();
}

如果您只对有条件地运行foo()感兴趣(当x为truthy时),则首选第二种形式,因为它更清楚地表达了意图。

人们可能更喜欢布尔逻辑版本的一个原因可能是javascript受到一个不寻常的限制:源代码大小(越冗长的源代码意味着使用越多的带宽); 由于布尔逻辑版本使用更少的字符,因此它的带宽效率更高。 在大多数情况下,我还是喜欢更详细的版本,除非经常使用这个脚本--对于像jQuery这样的库,使用这样的优化是完全合理的,但在大多数其他情况下却并非如此。