验证 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
将在 com
为 falsy
值时执行。这意味着 undefined
、false
、0
、""
或者 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 块也将执行。对象属性不被视为变量。
在阅读 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
将在 com
为 falsy
值时执行。这意味着 undefined
、false
、0
、""
或者 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 块也将执行。对象属性不被视为变量。