在阅读JSF书籍时,作者实现了一个地图,用作命名空间,在其中定义了一些JavaScript函数。
地图的实现方式如下:
if (!com) var com = {}
if (!com.example) {
com.example= {
myFunction: function(data) {
// some code here
}
}
}
我搜索了解语法但没有成功,有人可以向我解释!com
的含义吗?如果变量尚未声明,我们如何检查它?
答案 0 :(得分:5)
if (!com)
检查com
是否为falsey
值。 if (com)
检查它是否是真值,以便您可以看到!
反转测试。
在您的特定代码示例中:
if (!com) var com = {};
代码正在检查com
变量是否已定义并初始化。如果它尚未初始化,则其值为undefined
,这是一个假值,这将导致此代码初始化它。
在Javascript中,有许多falsey
个值,而undefined
就是一个这样的假值。假名值为:
null
""
false
NaN
0
undefined
有关falsey / truthy的更多信息,请参阅this article。
您必须注意的一件事是if (com)
或if (!com)
在某些情况下可能会导致引用错误。测试变量是否已定义和初始化的最安全方法是:
if (typeof com === "undefined")
因为在任何情况下都不会导致错误。
或者,命名空间的常见设计模式是:
var com = com || {};
这将定义并初始化com
作为命名空间对象(如果它尚不存在,具有真值)。
答案 1 :(得分:3)
这里的答案比仅仅检查更真实!truthy,因为OP已经通过询问为什么我们可以检查未分配的值来确认。是的,该示例的作者正在检查com
是否为假,如果是,则为其分配一个空对象,但这也有效,这取决于javascript variable hoisting和{{3}的使用}。
Javascript将在该范围的开头查找当前作用域中的所有变量,并为它们放置内存,即使无法推断出该值。因为代码中定义了com
,所以它的初始化被提升到它所在的范围的顶部(在这种情况下为全局),并且在进行检查之前已经为其分配了假值undefined
。 p>
在the way it is scoped中,我们可以看到提升定义com
变量,但是当执行到达下一个示例时,条件中的var与测试变量不同 - if (!comA) var comB = {}
- 控制台中抛出异常。
一旦被指定为对象,尝试访问该对象上的未定义属性也将返回falsey undefined
值,并且下一个if块也将执行。对象属性不会被视为变量。
答案 2 :(得分:2)
当if
为com
值时,第一个falsy
将会执行。这意味着undefined
,false
,0
,""
或null
。
请注意
null == false // returns false
但是
!null == !false // returns true
答案 3 :(得分:0)
如果您尚未定义变量,则尝试访问该变量将返回undefined
。由于undefined
在JS中是假的,!undefined
评估为true