下面的javascript語句會導致錯誤,如果ga沒有聲明。爲什麼JavaScript語句「ga = ga || []」有效?
if (ga)
{
alert(ga);
}
錯誤是:
ga is not defined
它看起來未聲明的變量不能在布爾表達式被識別。那麼,爲什麼下面的聲明有效?
var ga = ga || [];
對我而言,ga在「||」之前被視爲bool值。如果它是假的,在「||」之後表達被分配給最終的ga。
下面的javascript語句會導致錯誤,如果ga沒有聲明。爲什麼JavaScript語句「ga = ga || []」有效?
if (ga)
{
alert(ga);
}
錯誤是:
ga is not defined
它看起來未聲明的變量不能在布爾表達式被識別。那麼,爲什麼下面的聲明有效?
var ga = ga || [];
對我而言,ga在「||」之前被視爲bool值。如果它是假的,在「||」之後表達被分配給最終的ga。
編輯:您需要先使用var ga;
或var ga = ga || [];
,因爲它首先聲明ga並將值分配給它。
你可以試試這個
var x = 1, y = x + 1;
alert([x,y]) // 1,2
您可能會注意到,當y是聲明,X是已經聲明並已分配至它。
因此,在你的情況下,當ga || []
分配時,已經聲明瞭ga和它的有效變量。
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"]
在第二個語句中,檢查ga是否被定義,如果是true,則被分配給自己。否則,它會分配一個空值。
這適用於'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 || []
注意,在這兩種情況下,我明確地調用ga
爲window
(全局)對象的屬性。
你可以在這裏閱讀關於細節:Identifier Resolution, Execution Contexts and Scope Chains。
配置範圍內的var無關緊要。以下所有的都是一樣的:
var ga
ga = ga || []
var ga = ga || []
ga = ga || []
var ga
可能不太看起來怪怪的選項:
if (typeof ga !== 'undefined')
{
alert(ga);
}
您期待b可能是一個數組, 可能要使用基於B的陣列方法 或從中讀取索引值。
var b= s.match(/\d+/) || [];
return b[0];
此返回匹配的文本或undefined-
沒有空數組assignmentment,如果沒有匹配的第二線將拋出異常。
您的意思是'var ga = ga || []'因爲'ga = ga || [];也出錯(正如S.Mark指出的那樣)。 – R0MANARMY 2010-04-21 03:40:36
謝謝你指出這一點。我已經更新了這個問題。 – 2010-04-21 03:42:03
我認爲這是ga = ga || oh.la = la;想(yourBadRomance); – 2010-04-21 03:59:16