2011-12-07 5 views
3

これは私が得るのコードですが、私はこの2行を知らないの意味:誰にでもこの2行の意味を教えていただけますか?

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

誰が私を伝えることができますか? 1と自分自身を上書きし、

o = o[arr[i]]; 

二組のネストされたオブジェクトoそのキーarr[i]へ:

この:

o[arr[i]] = 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 || 2番目のものはループのためのものです(再帰として考える) –

答えて

3

ブレイクそれをステップ・バイ・ステップにするには明確である:

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

パターン:

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

と同じである。

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

は同じですA = B || DEFAULT_VALUEは、||演算子の短絡特性を使用するイディオムです。 javascriptでは、||演算子はtrueまたはfalseを返しませんが、代わりに最初の偽でない値またはfalseを返します。したがって、最初の変数が偽でない場合、最初の変数の値に評価されます。それ以外の場合は、2番目の変数の値に評価されます。

+0

今、私はそれを持っている、thx! – Rupert

3

は二つの文がありますそれ自身のキー/値です。

最初のセットは、oオブジェクトのキーarr[i]自身または空のオブジェクトです。 ||演算子はboolean型で、o[arr[i]]がfalseと評価された場合にのみ{}をトリガーします。

この種の文は、変数が初期化されているかどうかわからない場合(つまり、上書きしないように)、変数(グローバル名前空間など)を初期化するためによく使用されます。

+0

arr [1]またはarr [i]? – Ben

+0

'arr [i]'、そうです。小さいタイプ、悪い目。捕まえてくれてありがとう。 – buley

0

最初の行は、o[arr[i]]が確実に定義されています。以前に作成された場合はo[arr[i]]を設定し、o[arr[i]]が未定義の場合は新しいオブジェクト({})を設定します。

2行目は、1行目のオブジェクトをoに割り当てて、名前空間の探索を続行できるようにします。

0

関数GLOBAL.namespace(str)が存在しない場合は、名前空間(およびそのサブネームスペース)を作成するために使用されます。
arr = str.split(".")

  • それはグローバル名前空間にoを設定します:
    o=GLOBAL

    • それはサブ名前空間に、ピリオドでstrを分割:ここ

      は、それがどのように動作するかです

    • fiの場合は最初のサブネームスペースをスキップしますRSTサブ名前空間はGLOBALある:arrにおける各サブ名前空間の
      (arr[0]=="GLOBAL") ? 1 : 0

    • o下に存在する場合はチェックし、そうでない場合は、それを作成します:
      o[arr[i]] = o[arr[i]] || {};

    • oは1レベルで動作するように設定されています
      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'は最初にはnullになり、' o [arr [i]] = 'というループを通る最初の時間は、' o'があらかじめ存在していないために壊れます。親配列が存在しない場合、配列のサブ要素を設定することはできません。私のより冗長なコードでは、 'currentNamespace'が存在しなければ' currentNamespace [subNamespaceName] = 'はできないので、あなたはまだそうする必要があります。 –

    関連する問題