(myVar && foo())
以上代码的含义是什么?它等同于什么?
我认为它在单行上运行。
(myVar && foo())
以上代码的含义是什么?它等同于什么?
我认为它在单行上运行。
myvar
是假值,则为myvar
,如果myvar
是真值,则为foo()
。以下代码片段几乎相同。var x = (myvar && foo());
if(myvar){ var x = foo(); } else { var x = myvar; }
这是一个等同于“如果myVar不为falsey,则运行函数foo()”的表达式。
如果以这种方式使用:var x = (myVar && foo())
,结果将是:
如果myVar不为falsey,则x将被设置为foo()的输出。如果myVar为falsey,则x将被设置为myVar的值。
只有当myVar不是falsey的时候,才会调用foo()函数:也就是说,它不能是false、""、0、null或undefined。(还有其他的吗?)
通常我们会看到这样的例子:
window.console && console.log("some helpful debug info");
这段话的意思是...
"如果'window'变量有一个叫做'console'的成员..."
(重要的是要在'console'前加上'window.',因为如果console未定义,将会得到JavaScript错误而不是false。)
"...在'console'对象上调用'log'方法。"
0
、NaN
、零长度字符串、undefined
、null
,当然还有 false
都是 falsy... - Christian C. Salvadótrue
时,foo()才会执行。if (myVar) {
foo();
}
这样写代码会更清晰易懂。虽然在某些情况下,这种代码可能是有意义的,但如果你关心代码风格检查器(style checkers),它们会对此感到不满。请参见http://javascript.crockford.com/code.html。避免依赖分号插入和表达式语句是一个好习惯。
编辑:请注意,在某些情况下,var x = a && b();
可能并不是一个坏主意。然而,(a && b())
本身在几个方面都是错误的(分号插入、表达式语句,除了语义上难以理解)。
if (enabled && isVisible()) ...
或类似的情况下。 - Grumdrigif (x && y)
真的比if (x && y())
更好吗? - glomadcondition && action()
这种习惯用法。而且,我认为这是一种不好的做法。 - bobince当使用&&运算符时,先计算左侧即myVar
的值,如果为真,则继续计算右侧即foo()
的值。这是因为,在表达式A&&B中,如果A为假,则整个表达式A&&B总是会被计算为假。
通常情况下,上述语句会以以下方式使用:
var x = myVar && foo();
这也可以写成:
if myVar is truee x = foo(), else x = false