2017-08-10 115 views
0

我最近遇到了JavaScript Namespaces,以及如何使用它们来创建像其他流行的OOP语言一样的名称空间。我对他们如何申报感到困惑。例如,JavaScript名称空间对象文字

var myNamespace = myNamespace || {};

创建一个命名空间称为myNamespace如果尚未创建它。如果它被创建,只需将其传入var myNamespace

我很难理解myNamespace || {}究竟做了什么。

首先不确定myNamespace?你会如何比较布尔表达式。

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

我试过寻找关于SO的答案,但是关于如何声明不同类型的命名空间的做法存在太多饱和。

+0

undefined || {} === {}。是的,{}只是一个空对象 – juvian

+0

'||'是“或”。 “如果myNamespace已被定义,则将其分配给myNamespace,否则将myNamespace分配给一个空对象。 –

+0

这种命名空间的方法已经被ES6模块所淘汰。 – 2017-08-10 19:21:27

回答

1

虽然||原本打算用布尔工作,它是在允许它的工作设置默认值一个非常方便的方式来实现:

function or(a, b) { 
    if (a) return a 
    else return b 
} 

你可以在你的脑袋测试这一点,并看到它与布尔值一起工作:如果atrue,结果是true所以结果与a相同。如果afalse那么结果取决于b

JavaScript中的变量声明var工作有点奇怪。您可以在同一范围内重新声明具有相同标识符的变量。所以代码的工作方式是:

  • 如果已经声明了myNamespace,那么您将重新声明该变量而不分配给它。您可以从旧的myNamespace声明中获得价值。这个值被假定为truthy,所以||将返回它。
  • 如果myNamespace尚未声明,则声明它,然后myNamespace将为undefined,这是一个虚假值。因此,||将返回第二个值{},这是将分配给myNamespace的值。

它可能是有意义的在两个单独的步骤来阅读:

//Declare the variable if it doesn't exist, 
//without overwriting an existing value 
var myNamespace 
//Take the value of myNamespace (undefined if it didn't exist yet) 
//and replace it with {} if it is falsy 
myNamespace = myNamespace || {} 
2

var myNamespace = myNamespace || {};

请问你说的正是它。

||是看到here

那么这是在做一个or运营商,说var myNamespace = myNamespace但是,如果myNamespace是不确定的,那么它就会转到操作者的右手边,只是创建一个空像这样的对象(你说得对,这一点):

var myNamespace = {}

让我知道如果我似乎感到困惑,我想我解决您的观点。

1

看看的||定义从here

表达式1 || expr2

返回expr1是否可以转换为true;否则,返回 expr2。

现在尝试

console.log(undefined == true); 

这将打印false,这意味着undefined不能转换到true(我们使用的是==操作,让JavaScript中使用强制类型转换)。因此,如果myNamespace未定义,则会为其分配一个空的对象字面值(相当于引用中的expr2)。