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]=
。