2012-09-13 64 views
3

以下行的目的和結果是什麼?Javascript數組文字操作:這行代碼是做什麼的?

var arr = arr || []; 
+0

請注意,var arr = foo || [];如果foo未定義,可能會導致錯誤。這兩個陳述是相同的。 – AlexMA

+0

你的意思是「它可能...」?意味着它在什麼情況下會拋出錯誤? –

+0

如果foo未定義,它將*總是*拋出一個錯誤。我重寫了這句話,但沒有改變這個詞。 – AlexMA

回答

7

它聲明變量「ARR」,並將其值是已在所有腦幹(大概在一些外範圍)的另一變量,除非該變量不爲「truthy」在這種情況下「ARR」是設置爲引用一個新的空數組。

因此,如果已經存在的「ARR」的值爲null0false,或"",或者是undefined,則本地「ARR」將是一個空數組。否則,它將具有與外部「arr」相同的值。

你會常常看到,在這樣的情況:

var arr; 

function whatever() { 
    var arr = arr || []; 
    ... 
} 

有時人們這樣做:

function questionable(arr) { 
    var arr = arr || []; 

在這種情況下,var是不必要的。

這一切都有效,因爲JavaScript中的||運算符明顯不同於其他類似C語言的堂兄弟。在JavaScript中,||表達式的值是而不是被強制爲布爾值。相反,它是左手操作數或右手操作數的值。它確實檢查這些值以確定它們是否「真實」,但是布爾轉折是內部的。如果左邊是「truthy」,那麼||表達式的值就是該值;否則,這是右側的價值。當左邊是「truthy」時,根本不評估右邊。

3

實例化的Array如果arrfalsy一個new實例。


在C#中,這種模式被稱爲「空合併操作」。如果你熟悉C#你會做類似如下:

string foo = bar ?? String.Empty 

這裏有一個thorough post on the topic

2

基本上在Javascript和其他語言(如Perl)中,||通常用作短路操作符。如果您有需要被分配到其他5個變量之一的值,以先到爲準定義的變量,你可以嘗試這樣的:

a = b || c || d || e || f; 

這將評估b。如果它的值是true,那麼a將被分配b,就是這樣。如果發現bfalse,則搜索將傳播至c。通常需要將變量與自身進行比較來檢查是否分配新值。這就是a = a || b所做的。如果是Perl,你可以縮短到a ||= b

+0

雖然它實際上是「a | = b」,但語法(如「a || = b」)也存在於C中。儘管如此,感謝您的信息,這非常有幫助。 –

+0

隨時,夥計。繼續編碼! – SexyBeast