在jQuery的核心风格指南建议两种不同的方法来检查一个变量是否被定义。
- 全局变量:
typeof variable === "undefined"
- 局部变量:
variable === undefined
- 特性:
object.prop === undefined
为什么 jQuery 对全局变量使用一种方法而对局部变量和属性使用另一种方法?
在jQuery的核心风格指南建议两种不同的方法来检查一个变量是否被定义。
typeof variable === "undefined"
variable === undefined
object.prop === undefined
为什么 jQuery 对全局变量使用一种方法而对局部变量和属性使用另一种方法?
对于未声明的变量,typeof foo
将返回字符串文字"undefined"
,而身份检查foo === undefined
将触发错误“foo 未定义”。
对于局部变量(您知道在某处声明),不会发生此类错误,因此需要进行身份检查。
我会坚持在typeof foo === "undefined"
任何地方使用。那永远不会出错。
我想 jQuery 推荐这两种不同方法的原因是它们undefined
在 jQuery 代码所在的函数中定义了自己的变量,因此在该函数中undefined
是安全的,不会被外部篡改。我还想像某个地方的某个人已经对两种不同的方法进行了基准测试,并发现它foo === undefined
更快,因此决定这是要走的路。[更新:如评论中所述,与 的比较undefined
也略短,这可能是一个考虑因素。] 然而,在实际情况下的收益将完全微不足道:此检查永远不会成为任何类型的瓶颈,以及什么你失去的是重要的:评估一个宿主对象的属性进行比较可能会抛出一个错误,而一个typeof
检查永远不会。
例如,在 IE 中使用以下内容来解析 XML:
var x = new ActiveXObject("Microsoft.XMLDOM");
要检查它是否具有loadXML
安全的方法:
typeof x.loadXML === "undefined"; // Returns false
另一方面:
x.loadXML === undefined; // Throws an error
更新
typeof
我忘记提及的检查的另一个优点是它也适用于未声明的变量,foo === undefined
检查不这样做,并且实际上抛出一个ReferenceError
. 感谢@LinusKleen 提醒我。例如:
typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError
底线:始终使用typeof
支票。
使用 typeof-variant 的另一个原因:undefined
可以重新定义。
undefined = "foo";
var variable = "foo";
if (variable === undefined)
console.log("eh, what?!");
结果typeof variable
不能。
更新:请注意,在 ES5 中情况并非如此,全局undefined
是不可配置、不可写的属性:
15.1.1 全局对象的值属性
[...]
15.1.1.3 undefined
的值undefined
未定义(见 8.1)。此属性具有属性
{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
但它仍然可以被局部变量遮蔽:
(function() {
var undefined = "foo";
var variable = "foo";
if (variable === undefined)
console.log("eh, what?!");
})()
或参数:
(function(undefined) {
var variable = "foo";
if (variable === undefined)
console.log("eh, what?!");
})("foo")
因为undefined
并不总是声明的,但 jQueryundefined
在其主函数中声明。所以他们在undefined
内部使用安全值,但在外部,他们使用typeof
样式是安全的。
谁对 的性能增益感兴趣variable === undefined
,可以看看这里,但它似乎只是一个 chrome 优化。