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

我看到别的地方说,

x && foo();

等于

 if(x){ foo(); } 

我testing了一下,他们真的做了同样的事情。
但为什么? x && foo()究竟是什么?

AND和OR操作符都可以快捷。

因此&&只有在第一个是真的情况下才会尝试第二个expression式(更具体地说是类似于真实情况)。 第二个操作做的东西(不pipefoo()的内容是什么)并不重要,因为除非第一个expression式计算结果为真, 否则它不会被执行。 如果是真的,那么为了进行第二次testing, 被执行。

相反,如果第一个expression式在|| 陈述是真实的,第二个没有得到感动。 这样做是因为整个语句已经被评估过了,不pipe第二个expression式的结果如何,语句都是正确的,所以它会被忽略并且保持未执行。

使用这种快捷方式时要注意的情况当然是运算符的定义variables仍然评估为falsy值(例如0 )和真值(例如'zero' )的情况。

这就是所谓的短路评估 。

在这种情况下,如果x是False,那么foo()不需要被评估( &&的结果将始终为False)。 如果x为真,它需要被评估(即使结果被扔掉)。

这不完全相同。 第一个是可以使用的返回值的expression式; 第二个是一个声明。

如果你对返回值不感兴趣(也就是xfoo()值是否等于truthy值),它们是等价的,但是通常情况下,只有当你想使用布尔逻辑版本它作为一个布尔expression式,例如:

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

如果你只是有条件地运行foo() (当x是真的),第二种forms是首选,因为它更清楚地expression了意图。

人们可能更喜欢布尔逻辑版本的原因可能是JavaScript受到不同寻常的限制:源代码大小(更冗长的源代码意味着使用更多的带宽); 由于布尔逻辑版本使用较less的字符,所以它具有更高的带宽效率。 在大多数情况下,我仍然更喜欢使用更加冗长的版本,除非使用的脚本被大量使用 – 对于像jQuery这样的库,使用像这样的优化是完全合理的,但是在大多数情况下不是这样。

在JavaScript中, &&运算符从左到右评估并返回最右边的操作的值。 如果第一个条件评估为false,则不评估第二个条件。 所以它是一个简写说“ 如果东西不是空的或不确定的,做一些事情

这是短路。

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