JavaScript 命名空间对象字面量

JavaScript namespace object literal

我最近遇到了 JavaScript 命名空间以及如何使用它们来像其他流行的 OOP 语言一样创建命名空间。我对它们的声明方式感到困惑。例如,

var myNamespace = myNamespace || {};

创建一个名为 myNamespace 的命名空间(如果尚未创建)。如果已创建,只需将其传递给 var myNamespace

我无法理解 myNamespace || {} 的实际作用。

myNamespace一开始不会是undefined吧?您将如何在布尔表达式中进行比较。

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

我已经尝试在 SO 上寻找答案,但是关于如何声明不同类型的命名空间的实践太多了。

var myNamespace = myNamespace || {};

完全按照您所说的去做。

|| 是一个 or 运算符 here

所以这是在说 var myNamespace = myNamespace 但是,如果 myNamespace 是未定义的,那么它将只是转到运算符的右侧,并像这样创建一个空对象(你是对的):

var myNamespace = {}

如果我看起来很困惑,请告诉我,我想我已经解决了你的问题。

虽然 || 最初打算使用布尔值,但它以一种非常方便的方式实现,允许它设置默认值:

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

你可以在脑海中测试一下,看看它是否适用于布尔值:如果 atrue,结果是 true,所以结果与 a。如果 afalse 那么结果取决于 b.

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

  • 如果 myNamespace 已经被声明,你重新声明变量而不赋值给它。您从 myNamespace 的旧声明中获取值。该值被假定为真实值,因此 || 将 return 它。
  • 如果尚未声明 [​​=21=],则声明它,然后 myNamespace 将是 undefined,一个虚假值。因此 || 将 return 第二个值 {},这就是将分配给 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 || {}

看看||的定义来自here:

expr1 || expr2

Returns expr1 if it can be converted to true; otherwise, returns expr2.

现在试试

console.log(undefined == true);

这将打印false,这意味着undefined不能转换为true(我们正在使用==运算符让JavaScript使用类型强制)。因此,如果 myNamespace 未定义,将为其分配一个空对象文字(相当于引用中的 expr2)。