【问题标题】:JavaScript namespace object literalJavaScript 命名空间对象字面量
【发布时间】:2018-01-19 04:24:59
【问题描述】:

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

var myNamespace = myNamespace || {};

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

我很难理解 myNamespace || {} 的实际作用。

myNamespace 一开始不会是未定义的吗?您将如何在布尔表达式中进行比较。

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

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

【问题讨论】:

  • 未定义 || {} === {}。是的,{} 只是一个空对象
  • || 是“或”。 "如果myNamespace 已经定义,则将其分配给myNamespace,否则,将myNamespace 分配一个空对象。"
  • 这种命名空间方法已被 ES6 模块淘汰。
  • @torazaburo 那么在 ES6 中创建命名空间的最佳方法是什么?

标签: javascript namespaces javascript-namespaces


【解决方案1】:

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

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

您可以在头脑中测试它并查看它是否适用于布尔值:如果 atrue,则结果是 true,因此结果与 a 相同。如果afalse,那么结果取决于b

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

  • 如果myNamespace 已声明,则重新声明该变量而不对其进行赋值。您从 myNamespace 的旧声明中获取值。该值被假定为真实值,因此|| 将返回它。
  • 如果尚未声明 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 || {};

    完全按照你说的做。

    ||or 运算符,如 here 所示

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

    var myNamespace = {}

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

    【讨论】:

      【解决方案3】:

      here看一下||的定义:

      expr1 || expr2

      如果可以转换为true则返回expr1;否则,返回 expr2.

      现在试试

      console.log(undefined == true);
      

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

      【讨论】:

        猜你喜欢
        • 2013-10-25
        • 1970-01-01
        • 2014-07-05
        • 2021-04-05
        • 1970-01-01
        • 2016-06-28
        • 2014-10-08
        • 2011-03-04
        • 2016-02-01
        相关资源
        最近更新 更多