2010-01-11 52 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