2010-04-21 85 views
7

下面的javascript語句會導致錯誤,如果ga沒有聲明。爲什麼JavaScript語句「ga = ga || []」有效?

if (ga) 
{ 
    alert(ga); 
} 

錯誤是:

ga is not defined 

它看起來未聲明的變量不能在布爾表達式被識別。那麼,爲什麼下面的聲明有效?

var ga = ga || []; 

對我而言,ga在「||」之前被視爲bool值。如果它是假的,在「||」之後表達被分配給最終的ga。

+0

您的意思是'var ga = ga || []'因爲'ga = ga || [];也出錯(正如S.Mark指出的那樣)。 – R0MANARMY 2010-04-21 03:40:36

+0

謝謝你指出這一點。我已經更新了這個問題。 – 2010-04-21 03:42:03

+3

我認爲這是ga = ga || oh.la = la;想(yourBadRomance); – 2010-04-21 03:59:16

回答

3

編輯:您需要先使用var ga;var ga = ga || [];,因爲它首先聲明ga並將值分配給它。

你可以試試這個

var x = 1, y = x + 1; 
alert([x,y]) // 1,2 

您可能會注意到,當y是聲明,X是已經聲明並已分配至它。

因此,在你的情況下,當ga || []分配時,已經聲明瞭ga和它的有效變量。

+0

哎呀,我忘記了「var」。問題已更新。 – 2010-04-21 03:41:37

+2

是的,因爲當你使用'var'時,它首先聲明並且稍後發生賦值。 – YOU 2010-04-21 03:43:48

+0

得到2 downvotes ...,所以有人請指出我的回答是錯誤的?所以我可以糾正它。 – YOU 2010-04-21 04:30:32

4

null或者定義的是javascript中的falsey值(隱式評估爲false)。運算符返回第一個不計算爲false的值。

var x = 0 || "" || null || "hello" || false; // x equals "hello" 

在另一方面& &運營商將返回第一個falsey值或最後一個值。

var y = "a string" && {"attr":"an object"} && false && ["array"]; 
// y equals false 

var z = "a string" && {"attr":"an object"} && ["array"]; 
// z equals ["array"] 
0

在第二個語句中,檢查ga是否被定義,如果是true,則被分配給自己。否則,它會分配一個空值。

1

這適用於'var'的情況,因爲範圍解析中的變量停止被創建。 如果沒有'var',您只需從範圍鏈中查看並獲知。如果你真的想使用全局變量:

// This is fine because assignment always sets a property value 
// in this case (no 'var ga') it's the same as window.ga = window.ga || [] 
ga = window.ga || [] 

或者:

// Once again, only the lookup is affected with "running off" 
// the lookup chain. It's not that the variable has no value -- 
// the problem is there IS NO VARIABLE. 
if (!window.ga) { 
    ga = [] 
} 

甚至這樣的:

// First line is the same as window.ga = window.ga, 
// but now the property ga is guaranteed to exist on the window object -- 
// the VALUE of the property may (still) be undefined 
ga = window.ga 
ga = ga || [] 

注意,在這兩種情況下,我明確地調用gawindow(全局)對象的屬性。

你可以在這裏閱讀關於細節:Identifier Resolution, Execution Contexts and Scope Chains

配置範圍內的var無關緊要。以下所有的都是一樣的:

var ga 
ga = ga || [] 

var ga = ga || [] 

ga = ga || [] 
var ga 
1

可能不太看起來怪怪的選項:

if (typeof ga !== 'undefined') 
{ 
    alert(ga); 
} 
0

您期待b可能是一個數組, 可能要使用基於B的陣列方法 或從中讀取索引值。

var b= s.match(/\d+/) || []; 
return b[0]; 

此返回匹配的文本或undefined-

沒有空數組assignmentment,如果沒有匹配的第二線將拋出異常。