我最近遇到过JavaScript命名空间,以及如何使用它们来创建名称空间,就像其他流行的OOP语言一样。我对他们如何宣布感到困惑。例如,
var myNamespace = myNamespace || {};
myNamespace
的,则创建名称空间。如果已创建,只需将其传递到var myNamespace
。
我无法理解myNamespace || {}
实际上做了什么。
最初不会myNamespace
未定义吗?你会如何比较布尔表达式中的那个。
此外,对象文字{}
如何工作?它是否创建一个空对象并将其分配给myNamespace
以作为命名空间?
我已尝试在SO上寻找答案,但对于如何声明不同类型的命名空间的做法已经过于饱和。
答案 0 :(得分:1)
var myNamespace = myNamespace || {};
完全按照你说的做。
||
是一个or
运营商,见here
所以这是做的,说var myNamespace = myNamespace
然而,如果myNamespace
未定义,那么它将只是到操作符的右侧,只是创建一个这样的空对象(你这是正确的):
var myNamespace = {}
如果我感到困惑,请告诉我,我想我已经解决了你的观点。
答案 1 :(得分:1)
尽管||
最初打算与布尔值一起使用,但它是以非常方便的方式实现的,它允许它设置默认值:
function or(a, b) {
if (a) return a
else return b
}
您可以在脑海中测试一下,看看它是否适用于布尔值:如果a
为true
,则结果为true
,因此结果与{{1}相同}。如果a
为a
,则结果取决于false
。
JavaScript中b
的变量声明工作有点奇怪。您可以在同一范围内重新声明具有相同标识符的变量。所以代码的工作方式是:
var
,则重新声明变量而不分配它。您从myNamespace
的旧声明中获取值。假设此值是真实的,因此myNamespace
将返回它。||
,则声明它,然后myNamespace
将为myNamespace
,这是一个假值。因此,undefined
将返回第二个值||
,这是将分配给{}
的值。通过两个单独的步骤阅读它可能是有意义的:
myNamespace
答案 2 :(得分:1)
从here了解||
的定义:
expr1 ||表达式2
如果可以转换为true,则返回expr1;否则,返回 表达式2。
现在尝试
console.log(undefined == true);
这将打印false
,这意味着undefined
无法转换为true
(我们使用==
运算符让JavaScript使用类型强制)。因此,如果未定义myNamespace
,则会为其分配一个空对象文字(相当于引用中的expr2
)。