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
}
你可以在脑海中测试一下,看看它是否适用于布尔值:如果 a
是 true
,结果是 true
,所以结果与 a
。如果 a
是 false
那么结果取决于 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
)。
我最近遇到了 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
}
你可以在脑海中测试一下,看看它是否适用于布尔值:如果 a
是 true
,结果是 true
,所以结果与 a
。如果 a
是 false
那么结果取决于 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
)。