2010-01-11 60 views

回答

8

表达式求myvar如果myvar是falsey,和foo()如果myvar是truthy。以下片段几乎完全相同。

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的值。

+0

如果MYVAR是truthy X没有设置正确,其置为foo()的值,无论可能如何。 – brad 2010-01-11 22:42:35

+0

这不太对。如果myVar是0,那么x被设置为0,而不是false。 – 2010-01-11 22:45:30

+0

你们都是对的。答复修正。 – glomad 2010-01-11 23:05:53

1

该表达式巧妙地使用了布尔表达式中的短路。只有当myVar的值为true时,foo()才会执行。

if (myVar) { 
    foo(); 
} 

更清晰。有些情况下这种代码是有意义的,但是风格检查器(如果你对这种事感兴趣的话)会适合它。请参阅http://javascript.crockford.com/code.html。避免依赖分号插入和表达式语句是一种很好的做法。

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

+2

我在jQuery脚本(对话框UI)上看到了这个... – Val 2010-01-11 22:35:57

+2

“利用”“愚蠢”这些是一些强烈的话:)如果你使用JS很多,它是有道理的,并且它是清楚的。 – 2010-01-11 22:36:18

+3

当然有些情况下,这些代码不会被任何合理的措施所愚弄。比如在if(enabled && isVisible())...或者这种情况下。 – Grumdrig 2010-01-11 22:39:32

3

,把foo()函数才会被调用,如果myVar的不falsey:这意味着它不能是假的, “”,0,null或未定义。 (任何其他方面?)

这是比较典型的,看这样一个例子:

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

这被解释如下...

“如果‘窗口’变量有一个成员叫'控制台” ......‘

(前缀是很重要的‘控制台’与‘窗口’。因为,如果控制台是不确定的,你会得到一个JavaScript错误,而不是假的。)

’...在在'控制台'对象上唤醒'log'方法。“

+1

*“其他人?”*我认为只是-0和NaN。 – 2010-01-11 22:55:54

+1

@Jason:'0','NaN',一个零长度的字符串,undefined,null和false当然是虚假的...... – CMS 2010-01-11 23:00:09

+0

啊,在我写作时想到了NaN,但是忘了输入。谢谢! – 2010-01-11 23:03:07

0

当& &被评估左手首先计算即myVar,如果这是真,那么只有右手侧被评估即foo()。这是因为如果A为假,那么表达式A & & B将始终评估为假。

上面的语句以下列方式通常用于:

var x = myVar && foo(); 

这也可以写成:

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