JavaScript中的(myVar && foo())是什么意思?

6
(myVar && foo())

以上代码的含义是什么?它等同于什么?

我认为它在单行上运行。

5个回答

8
该表达式的值如果myvar是假值,则为myvar,如果myvar是真值,则为foo()。以下代码片段几乎相同。
var x = (myvar && foo());

if(myvar){ var x = foo(); } else { var x = myvar; }

4

这是一个等同于“如果myVar不为falsey,则运行函数foo()”的表达式。

如果以这种方式使用:var x = (myVar && foo()),结果将是:

如果myVar不为falsey,则x将被设置为foo()的输出。如果myVar为falsey,则x将被设置为myVar的值。


如果myvar为真值,则x不会被设置为true,而是被设置为foo()的值,无论它是什么。 - brad
这不太对。如果myVar为0,则x被设置为0,而不是false。 - Jason Orendorff

3

只有当myVar不是falsey的时候,才会调用foo()函数:也就是说,它不能是false、""、0、null或undefined。(还有其他的吗?)

通常我们会看到这样的例子:

window.console && console.log("some helpful debug info");

这段话的意思是...

"如果'window'变量有一个叫做'console'的成员..."

(重要的是要在'console'前加上'window.',因为如果console未定义,将会得到JavaScript错误而不是false。)

"...在'console'对象上调用'log'方法。"


1
还有其他的吗?我想只有-0和NaN。 - Jason Orendorff
1
@Jason:0NaN、零长度字符串、undefinednull,当然还有 false 都是 falsy... - Christian C. Salvadó
啊,我在写的时候想到了NaN,但忘记打了。谢谢! - Drew Wills

1
该表达式巧妙地利用了布尔表达式中的短路。只有当myVar评估为true时,foo()才会执行。
if (myVar) {
    foo();
}

这样写代码会更清晰易懂。虽然在某些情况下,这种代码可能是有意义的,但如果你关心代码风格检查器(style checkers),它们会对此感到不满。请参见http://javascript.crockford.com/code.html。避免依赖分号插入和表达式语句是一个好习惯。

编辑:请注意,在某些情况下,var x = a && b(); 可能并不是一个坏主意。然而,(a && b()) 本身在几个方面都是错误的(分号插入、表达式语句,除了语义上难以理解)。


2
"Exploiting"和"stupid"是一些强烈的词语 :) 如果你经常使用JS,那么它作为现有的内容是有意义和清晰的。 - Doug Neiner
3
在某些情况下,这样的代码并不会被任何合理的标准视为愚蠢。例如,在 if (enabled && isVisible()) ... 或类似的情况下。 - Grumdrig
修改答案,使其看起来不那么像是在挑衅。 - Samantha Branham
在这种情况下,变量和函数实际上没有什么实际区别。if (x && y)真的比if (x && y())更好吗? - glomad
1
jQueryUI的代码经常使用condition && action()这种习惯用法。而且,我认为这是一种不好的做法。 - bobince
显示剩余4条评论

0

当使用&&运算符时,先计算左侧即myVar的值,如果为真,则继续计算右侧即foo()的值。这是因为,在表达式A&&B中,如果A为假,则整个表达式A&&B总是会被计算为假。

通常情况下,上述语句会以以下方式使用:

var x = myVar && foo();

这也可以写成:

if myVar is truee x = foo(), else x = false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接