2011-12-07 87 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] ='。 –

    相关问题