变量 === 未定义 vs. 类型变量 === “未定义”
2022-08-29 23:43:46
jQuery 核心样式指南建议了两种不同的方法来检查变量是否已定义。
- 全局变量:
typeof variable === "undefined"
- 局部变量:
variable === undefined
- 性能:
object.prop === undefined
为什么 jQuery 对全局变量使用一种方法,而对局部变量和属性使用另一种方法?
jQuery 核心样式指南建议了两种不同的方法来检查变量是否已定义。
typeof variable === "undefined"
variable === undefined
object.prop === undefined
为什么 jQuery 对全局变量使用一种方法,而对局部变量和属性使用另一种方法?
对于未声明的变量,将返回字符串文本,而恒等检查将触发错误“foo未定义”。typeof foo
"undefined"
foo === undefined
对于局部变量(您知道在某处声明),不会发生此类错误,因此需要进行标识检查。
我会坚持到处使用。这永远不会出错。typeof foo === "undefined"
我想jQuery推荐这两种不同方法的原因是它们在jQuery代码所在的函数中定义了自己的变量,因此在该函数中可以防止外部篡改。我也会想象某个地方的某个人已经对两种不同的方法进行了基准测试,并发现它更快,因此决定这是要走的路。[更新:如评论中所述,与未定义的
比较也略短,这可能是一个考虑因素。但是,在实际情况下,收益将是完全微不足道的:此检查永远不会成为任何类型的瓶颈,并且您丢失的内容非常重要:评估主机对象的属性进行比较可能会引发错误,而检查永远不会。undefined
undefined
foo === undefined
typeof
例如,在 IE 中使用以下方法来解析 XML:
var x = new ActiveXObject("Microsoft.XMLDOM");
要安全地检查它是否具有方法,请执行以下操作:loadXML
typeof x.loadXML === "undefined"; // Returns false
另一方面:
x.loadXML === undefined; // Throws an error
更新
我忘记提到的检查的另一个优点是,它也适用于未声明的变量,而检查没有,实际上会抛出一个.感谢@LinusKleen提醒我。例如:typeof
foo === undefined
ReferenceError
typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError
底线:始终使用支票。typeof