2011-05-29 59 views
14

從谷歌Analytics跟蹤代碼:javascript:這是一個有條件的任務嗎?

var _gaq = _gaq || []; 

是如何工作的呢?

它是一個條件變量賦值? 這是否與說:

if(!(_gaq)) {_gaq = []; } 

+0

可能的[重要]運算符做?](http://stackoverflow.com/questions/830618/what-does-the-operator-do) – 2011-05-29 13:08:37

+0

簡短回答:是(雖然第二個創建一個全局'_gaq' *編輯:*如果我們假設'_gaq'不存在)。 – 2011-05-29 13:08:51

+0

@Felix - 除非別的東西對'_gaq'應用不同的範圍 – Quentin 2011-05-29 13:12:26

回答

15

如果它是一個真值,or或運算符(||)將返回左側,否則它將返回右側。

它與您的第二個示例非常相似,但由於它使用了關鍵字var,因此它還爲該變量建立了一個本地範圍。

5

是的。

||運算符評估爲其最左邊的「truthy」操作數。
如果_gaq是「falsy」(例如nullundefined0),它將評估到右側([])。

+3

或'false'或'「」''(空字符串) – 2011-05-29 13:15:59

+0

+1因爲我喜歡你的描述 – 2012-09-20 14:34:06

1

其實它等於說:

if (!_gaq) _gaq = []; 

至少不一定。試想一下:

function outer() { 
    var _gaq = null; 
    function inner() { 
    var _gaq = _gaq || []; 
    // ... 
    } 

    inner(); 
    _gaq = 1; 
    inner(); 
} 

當有一個「_gaq」(我討厭打字,通過的方式)在外部詞法範圍,你最終是什麼在內部範圍變量。 「if」聲明的不同之處在於非常重要的方式—在那種情況下只有一個「_gaq」。

2

這是相同的話說:

if(!(_gaq)) {var _gaq = [];} 

(這是可以做到,因爲VAR是條件檢查上面的懸掛,從而避免了「沒有定義」的錯誤,而且還會引起_gaq是自動視爲範圍內的本地範圍。)