(myVar && foo())
上面的代码是什么意思?它相当于什么?
我认为它在一条线上运行。
该表达式的计算结果为myvar
ifmyvar
为 false,foo()
ifmyvar
为 true。以下片段几乎相同。
var x = (myvar && foo());
if(myvar){ var x = foo(); } else { var x = myvar; }
它是一个等同于“如果 myVar 不是假的,则运行函数 foo()”的表达式。如果像这样使用: var x = (myVar && foo())
,结果将是:
如果 myVar 不是假的,x 将被设置为 foo() 的输出。如果 myVar 为 false,则 x 将设置为 myVar 的值。
foo() 函数只会在 myVar 不为 false 时被调用:这意味着它不能为 false、""、0、null 或 undefined。(还有其他人吗?)
更典型的是看到这样的例子:
window.console && console.log("some helpful debug info");
这解释如下...
“如果'window'变量有一个名为'console'的成员......”
(在 'console' 前面加上 'window' 很重要。因为如果控制台未定义,您将收到 JavaScript 错误而不是 false。)
“……在‘控制台’对象上调用‘日志’方法。”
该表达式巧妙地利用了布尔表达式中的短路。foo() 仅在 myVar 评估为 时才会执行true
。
if (myVar) {
foo();
}
清晰得多。可能在某些情况下这种代码是有意义的,但是样式检查器(如果您对那种东西感兴趣)会对其产生影响。请参阅http://javascript.crockford.com/code.html。避免依赖分号插入和表达式语句是一个很好的做法。
编辑:请注意,var x = a && b();
在某些情况下这可能不是一个坏主意。然而,(a && b())
它本身在几个方面是错误的。(分号插入,表达式语句,除了语义上的隐晦)
当 && 被评估时,首先评估左手myVar
,如果这是真的,那么只评估右手边,即foo()
。这是因为在语句 A && B 中,如果 A 为假,那么表达式 A&&B 将始终计算为假。
上述语句通常以如下方式使用:
var x = myVar && foo();
这也可以写成:
if myVar is truee x = foo(), else x = false