2011-12-07 86 views
3

這是代碼我得到的,但我不知道這兩條線是指:有人能告訴我這兩行意味着什麼嗎?

o[arr[i]] = o[arr[i]] || {}; 
o = o[arr[i]]; 

有誰能夠告訴我嗎?

var GLOBAL={}; 
GLOBAL.namespace=function(str){ 
    var arr = str.split("."), o=GLOBAL; 

    for(i=(arr[0]=="GLOBAL") ? 1 : 0; i<arr.length; i++){ 
     o[arr[i]] = o[arr[i]] || {}; 
     o = o[arr[i]]; 
    } 
}; 

GLOBAL.namespace("A.Dog"); 
// GLOBAL.A = {}; 
// GLOBAL.A.Dog = {}; 
GLOBAL.A.Dog.name = "diudiu"; 
alert(GLOBAL.A.Dog.name) 
+0

第一個是經典的'x = x ||值',第二個只是爲循環(認爲它是遞歸) –

回答

3

打破它一步一步做更清晰:

o[arr[i]] = o[arr[i]] || {}; 

是一樣的:

var x = arr[i]; 
o[x] = o[x] || {}; 

是一樣的:

var x = arr[i]; 
if (o[x] == undefined) { 
    o[x] = {}; 
} 

模式A = B || DEFAULT_VALUE是一種使用||算子的短路性質的成語。在javascript中,||運算符不返回truefalse,而是返回第一個非錯誤值或false。因此,如果第一個變量不是虛假的,則它計算第一個變量的值,否則計算第二個變量的值。

+0

現在我明白了,thx! – Rupert

3

有兩種說法:

此:

o[arr[i]] = o[arr[i]] || {}; 

和:

o = o[arr[i]]; 

第二組嵌套對象o,其重點arr[i],一個覆蓋本身它是自己的關鍵/價值觀。

第一組的該o對象的鍵arr[i]本身或空對象。 ||運算符是布爾值,如果o[arr[i]]的計算結果爲false,則只會觸發{}

這樣的說法經常被用來並初始化變量(例如全局命名空間),當你不知道它是否已經被初始化(這樣你就不會覆蓋它)。

+0

arr [1]或arr [i]? – Ben

+0

'arr [i]',你是對的。微小的類型,壞眼睛。感謝捕捉。 – buley

0

第一行確保o[arr[i]]被定義。如果o[arr[i]]未定義,則它可以將o[arr[i]]設置爲自身,或者設置爲新對象(即{})。

第二行從第一行的對象分配給o使得命名空間遍歷可以繼續。

0

功能GLOBAL.namespace(str)使用,如果它不存在創建一個命名空間(及其子命名空間)。

這裏是它如何工作的:
arr = str.split(".")

  • 它設置o到全局命名空間:
    o=GLOBAL

    • 它通過週期爲子命名空間分割了str

    • 它跳過第一個子命名空間,如果fi RST子命名空間是GLOBAL
      (arr[0]=="GLOBAL") ? 1 : 0

    對於每個子命名空間中arr

    • 它檢查是否存在o下,如果沒有,就創建它:
      o[arr[i]] = o[arr[i]] || {};

    • 它設置o工作一個級別更深層次的,所以它可以在下一子命名空間的工作:
      o = o[arr[i]];

    爲了理解功能的目的,在這裏與闡述了每個變量的目的的版本,和步驟拆分多一點:

    var GLOBAL={}; 
    GLOBAL.namespace=function(fullNamespaceName){ 
        var namespaceNames = fullNamespaceName.split("."); // arr 
        var currentNamespace=GLOBAL; // o 
        var currentIndex = (namespaceNames[0]=="GLOBAL") ? 1 : 0; // i 
    
        for(; currentIndex<namespaces.length; currentIndex++){ 
        var subNamespaceName = namespaceNames[currentIndex]; 
        var subNamespace = currentNamespace[subNamespaceName]; 
        subNamespace = subNamespace || {}; 
        currentNamespace[subNamespaceName] = subNamespace; 
        currentNamespace = subNamespace; 
        } 
    }; 
    
    +0

    是設置o = GLOBAL的必要步驟嗎? – Rupert

    +0

    @ user1049555:如果你沒有,會發生什麼? 「o」在開始時爲空,並且通過循環「o [arr [i]] ='第一次就會中斷,因爲事先不存在」o「。如果父數組不存在,則不能設置數組的子元素。在我更詳細的代碼中,你仍然必須這樣做,因爲除非currentNamespace存在,否則你不能'currentNamespace [subNamespaceName] ='。 –

    相關問題