JavaScript命名空间对象文字

时间:2017-08-10 19:15:44

标签: javascript namespaces javascript-namespaces

我最近遇到过JavaScript命名空间,以及如何使用它们来创建名称空间,就像其他流行的OOP语言一样。我对他们如何宣布感到困惑。例如,

var myNamespace = myNamespace || {};

如果尚未创建名为myNamespace

,则创建名称空间。如果已创建,只需将其传递到var myNamespace

我无法理解myNamespace || {}实际上做了什么。

最初不会myNamespace未定义吗?你会如何比较布尔表达式中的那个。

此外,对象文字{}如何工作?它是否创建一个空对象并将其分配给myNamespace以作为命名空间?

我已尝试在SO上寻找答案,但对于如何声明不同类型的命名空间的做法已经过于饱和。

3 个答案:

答案 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
}

您可以在脑海中测试一下,看看它是否适用于布尔值:如果atrue,则结果为true,因此结果与{{1}相同}。如果aa,则结果取决于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)。