验证 JavaScript 中是否存在变量

Verifying the existence of a variable in JavaScript

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

地图是这样实现的:

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

      // some code here

    }
  }
}

我搜索了解该语法但没有成功,有人可以向我解释 !com 是什么意思吗?如果变量尚未声明,我们如何检查它?

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 定义并初始化为命名空间对象(如果它还不存在真值的话)。

如果您尚未定义变量,尝试访问它会 return undefined。由于 undefined 在 JS 中是假的,!undefined 计算为 true

第一个 if 将在 comfalsy 值时执行。这意味着 undefinedfalse0"" 或者 null.

注意

null == false          // returns false

但是

!null == !false       // returns true

这里的答案比仅仅检查 !truthy 更微妙,正如 OP 通过询问为什么我们可以检查未分配的值所承认的那样。是的,该示例的作者正在检查 com 是否为假,如果是则为它分配一个空对象,但事实上这是否有效取决于 javascript variable hoisting and the way it is scoped 的使用。

Javascript 将在当前作用域的开头查找所有变量,并为它们保留内存,即使无法推导出该值。因为 com 是在代码中定义的,所以它的初始化被提升到它所在范围的顶部(在这种情况下是全局范围),并且在进行检查之前它已经被分配了假值 undefined

fiddle here 中我们可以看到提升定义了 com 变量,但是当执行到下一个例子时,条件中的 var 与测试变量不同 - if (!comA) var comB = {} - 控制台抛出异常。

一旦分配为对象,尝试访问该对象上未定义的 属性 也将 return 一个错误的 undefined 值,下一个 if 块也将执行。对象属性不被视为变量。