Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这两行的意思是:o[x]=o[x]| |{};o=o[x];_Javascript_Function_Namespaces - Fatal编程技术网

Javascript 这两行的意思是:o[x]=o[x]| |{};o=o[x];

Javascript 这两行的意思是:o[x]=o[x]| |{};o=o[x];,javascript,function,namespaces,Javascript,Function,Namespaces,这是我得到的代码,但我不知道这两行的意思是: 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[

这是我得到的代码,但我不知道这两行的意思是:

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)
var GLOBAL={};
GLOBAL.namespace=function(str){
var arr=str.split(“.”),o=GLOBAL;

对于(i=(arr[0]=“GLOBAL”)?1:0;i有两种说法:

这:

o[arr[i]] = o[arr[i]] || {};
以及:

第二个将嵌套对象
o
设置为其键
arr[i]
,并用其自己的键/值之一覆盖自身

第一组是对象本身或空对象的
o
arr[i]
o[arr[i]
操作符是一个布尔or,只有当
o[arr[i]
的计算结果为false时才会触发
{}


当您不知道某个变量是否已初始化(因此您不会覆盖它)时,这种语句通常用于初始化该变量(例如,在全局命名空间中)。

将其逐步分解以使其更清晰:

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

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

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

模式
A=B | | | |默认值
是一种习惯用法,它使用了
|
运算符的短路特性。在javascript中,
|
运算符不返回
,而是返回第一个非假值或
。因此,如果第一个变量不是假,则返回e计算第一个变量的值,否则计算第二个变量的值。

第一行确保定义了
o[arr[i]]
。如果先前创建了
o[arr[i]]
,则将其自身设置为
o[arr[i]
,如果未定义
o[arr[i]
,则将其设置为新对象(即
{}


第二行将对象从第一行分配到
o
,以便命名空间遍历可以继续。

函数
GLOBAL.namespace(str)
用于创建命名空间(及其子命名空间)(如果它不存在)

以下是它的工作原理:

  • 它按句点将
    str
    拆分为子名称空间:
    arr=str.split(“.”

  • 它将
    o
    设置为全局命名空间:
    o=GLOBAL

  • 如果第一个子命名空间是
    GLOBAL

    (arr[0]=“全局”)?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;
  }
};
var GLOBAL={};
GLOBAL.namespace=函数(fullNamespaceName){
var namespaceNames=fullNamespaceName.split(“.”;//arr
var currentNamespace=GLOBAL;//o
var currentIndex=(名称空间名称[0]=“全局”)?1:0;//i

对于(;currentIndexfirst一个是经典的
x=x | | |值
,第二个仅用于循环(将其视为递归)
arr[i]
,你说得对。字体很小,眼睛不好。谢谢你的关注。设置o=GLOBAL是必须的吗?@user1049555:如果你不这样做会发生什么?
o
一开始是空的,第一次通过循环
o[arr[i]]=
将中断,因为
o
事先不存在。如果父数组不存在,则无法设置数组的子元素。在我更详细的代码中,您仍然必须设置,因为除非
currentNamespace
存在,否则无法
currentNamespace[subnamespace]=