验证JavaScript中是否存在变量

时间:2015-02-18 21:17:05

标签: javascript namespaces

在阅读JSF书籍时,作者实现了一个地图,用作命名空间,在其中定义了一些JavaScript函数。

地图的实现方式如下:

if (!com) var com = {}
if (!com.example) {
    com.example= {
       myFunction: function(data) {

      // some code here

    }
  }
}

我搜索了解语法但没有成功,有人可以向我解释!com的含义吗?如果变量尚未声明,我们如何检查它?

4 个答案:

答案 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)

ifcom值时,第一个falsy将会执行。这意味着undefinedfalse0""null

请注意

null == false          // returns false

但是

!null == !false       // returns true

答案 3 :(得分:0)

如果您尚未定义变量,则尝试访问该变量将返回undefined。由于undefined在JS中是假的,!undefined评估为true