(myVar && foo())
上述代码是什么意思?它等同于什么?
我认为它只能在一条线上运行。
答案 0 :(得分:8)
如果myvar
为假,则表达式评估为myvar
;如果foo()
为真,则表达式为myvar
。以下片段几乎完全相同。
var x = (myvar && foo());
if(myvar){ var x = foo(); } else { var x = myvar; }
答案 1 :(得分:4)
它是一个表达式,等于“如果myVar不是假的,运行函数foo()”。
如果它使用如下:var x = (myVar && foo())
,结果将是:
如果myVar不是假的,x将被设置为foo()的输出。如果myVar是假的,那么x将被设置为myVar的值。
答案 2 :(得分:3)
仅当myVar不是 falsey 时才会调用foo()函数:这意味着它不能为false,“”,0,null或undefined。 (还有其他人吗?)
更典型的是看到这样的例子:
window.console && console.log("some helpful debug info");
这解释如下......
“如果'window'变量有一个名为'console'的成员......”
(将'console'加上'window'是很重要的,因为如果未定义控制台,你将得到一个JavaScript错误而不是false。)
“...在'console'对象上调用'log'方法。”
答案 3 :(得分:1)
该表达式巧妙地在布尔表达式中使用短路。 foo()只有在myVar求值为true
时才会执行。
if (myVar) {
foo();
}
更清楚。有可能这种代码有意义,但样式检查器(如果你对这类事情感兴趣)会对它有所帮助。见http://javascript.crockford.com/code.html。避免依赖分号插入和表达式语句是一种很好的做法。
编辑:请注意var x = a && b();
在某些情况下可能不是一个坏主意。但是,(a && b())
本身在某些方面是错误的。 (分号插入,表达声明,除了语义上的神秘之外)
答案 4 :(得分:0)
当&&评估左手首先评估,即myVar
,如果这是真的那么只评估右手,即foo()
。这是因为声明A&& B如果A为假,那么表达式A& B将始终评估为假。
以上陈述通常以下列方式使用:
var x = myVar && foo();
这也可以写成:
if myVar is truee x = foo(), else x = false