44

我看到别的地方说,

x && foo();

 等于

if(x){
    foo();
}

我测试了它,他们确实做了同样的事情。
但为什么?究竟是x && foo()什么?

4

5 回答 5

69

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

因此,&&仅在第一个表达式为真时才尝试第二个表达式(更具体地说,是真实的)。第二个操作执行某些操作(无论其内容如何foo())这一事实并不重要,因为除非第一个表达式的计算结果是真实的,否则它不会被执行。如果它是真的,那么它将被执行以尝试第二次测试。

相反,如果语句中的第一个表达式||为真,则不会触及第二个表达式。这样做是因为已经可以评估整个语句,无论第二个表达式的结果如何,该语句都会导致结果为真,因此它将被忽略并保持未执行状态。

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

于 2011-08-07T02:35:14.417 回答
24

这称为短路评估

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

于 2011-08-07T02:38:04.987 回答
8

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

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

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

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

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

于 2011-08-07T12:14:49.753 回答
3

在 javascript 中,&&运算符从左到右计算并返回最右边的操作的值。如果第一个条件评估为假,则不会评估第二个条件。所以它是“如果某事不是空的或未定义的,做某事”的简写

于 2011-08-07T02:35:33.990 回答
2

是短路。

运算符的&&工作方式如下:它对两边的两个操作数进行逻辑或。如果左侧具有非零值,则评估右侧以确定真值。如果左侧为零,那么无论右侧是什么,表达式将计算为 0,因此计算右侧。所以实际上,如果x是非零则只foo被调用,如果x是0则不foo被调用,因此,它就像if - else在这种情况下一样工作。

于 2011-08-07T02:39:08.417 回答