什么是“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式; 第二个是一个声明。
如果你对返回值不感兴趣(也就是x
和foo()
值是否等于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
工作。