2013-02-19 55 views
4

我感興趣的使用&&這樣的聲明變量的實際應用:使用邏輯與在Javascript變量聲明

var x = undefined && 4; 

// Evaluate to the first falsey value 
// or else the last value. 

eval(x); 
// undefined 

我理解的價值是如何計算(見this SO answer)。我也明白了它的姊妹||(見here爲一個偉大的描述),爲什麼它來聲明一個變量,下面的表達式將是有益的:

// Some other variable 
var y; 

var x = y || 4; 

// Evaluate to the first truthy value 
// or else the last value. 

實際上:除非首先看重的是falsey使用第一個值;如果是這樣,請使用最後一個值。我們可以證明在瀏覽器控制檯的||這一特點:

> null || 4 
    4 
> 4 || null 
    4 

> null || undefined 
    undefined 
> undefined || null 
    null 

> true || 4 
    true 
> 4 || true 
    4 

至於&&

> null && 4 
    null 
> 4 && null 
    null 

> null && undefined 
    null 
> undefined && null 
    undefined 

> true && 4 
    4 
> 4 && true 
    true 

如果我們認爲這意味着:除非首先看重的是truthy使用第一個值;如果是這樣,使用最後一個值?

我有興趣使用編碼快捷方式來最大限度地減少條件語句的使用,並且我想知道我能否以某種方式使用這個。

我發現了jQuery核心源的line 472這種編碼方法的一個例子:

scripts = !keepScripts && []; 

所以,問題是這樣的:任何人都可以形容一個很好的上下文在JavaScript變量聲明使用&&?你認爲這是不好的做法嗎?

謝謝!

+1

我個人建議不要這樣做:它確實不太可讀。在不知道這種行爲的情況下,我期望像'!keepScripts && []'這樣的東西能夠評估爲'false',這可能會導致一些難以追蹤的錯誤。 – ChrisC 2013-02-19 21:55:50

+0

我會編寫普通的條件語句,然後使用高級的縮小器,例如[Google Closure Compiler](https://developers.google.com/closure/compiler/)來縮小代碼。 – 2013-02-19 22:00:40

回答

3

一般而言,如果代碼對於典型的JavaScript程序員來說比其他代碼更易讀,那麼您應該只使用這樣的「快捷方式」。

在思考什麼是更易讀,少奇,認爲

var foo; 
if(bar) { 
    foo=[]; 
} 

var foo = bar && []; 

是不一樣的。例如,如果barNaN,那麼foo在後面的情況下將是NaN,這可能稍後會成爲頭疼的人。

由於有工具可以優化/最小化JavaScript,因此您應該關注代碼的可讀性,這並不總是與簡潔相同。

假設你在一行中有幾個這樣的重複初始化,它們都依賴於不同的變量(所以它們不能被包裝成單個條件),但遵循相同的邏輯公式。在這種情況下,一旦讀者已經精神分析了公式的含義,他們可以快速掃描所有實例並查看每個實例之間的差異。在這種情況下,不是依賴大多數JavaScript程序員熟悉的約定(如var foo = some_opt || {}),而是創建一個本地化約定,讀者必須爲此文件學習。即使在這種情況下,我也會建議一些慎重的考慮,它可能不值得。

0

其實,你不應該經常使用& &運算符,因爲它總是有風險的代碼。由於這種用法,您可能會忘記自己做了什麼,或者可能找不到錯誤。我個人認爲這是一種不好的做法。您可能更喜歡使用,但代碼變得不可讀。我們開發人員應該考慮代碼的可理解性和可讀性。

0

嗯,這是一個常見的習慣用語,但它可能會讓你的代碼更不可讀。所以,我的建議,保持簡單,即使它意味着更多的擊鍵。

1

我發現了一個特殊情況,在調試過程中使用&&會很有用。

假設我們有一個變量x。有時x的值爲null,有時x是值爲{'foo':'bar'}的對象。我們想寫一個表達式,如果存在的話,它返回值x.foo

但是,我們必須小心。調用的對象不存在的屬性可能會導致這樣的:

> Uncaught TypeError: Cannot read property 'foo' of null 

因此,我們可以這樣寫:

x && x.foo 

後者執行以下步驟:

  1. 如果x被一個對象和x.foo存在,給我們的價值x.foo

  2. 如果x是Object且x.foo不存在,則返回undefined

  3. 如果x爲空,則返回null

只要x已經提到某處(即使x被簡單地設置爲空或未定義),則表達式不應破壞代碼。