变量 === 未定义与 typeof 变量 === “未定义”

IT技术 javascript jquery undefined
2021-01-24 18:00:49

jQuery的核心风格指南建议两种不同的方法来检查一个变量是否被定义。

  • 全局变量: typeof variable === "undefined"
  • 局部变量: variable === undefined
  • 特性: object.prop === undefined

为什么 jQuery 对全局变量使用一种方法而对局部变量和属性使用另一种方法?

6个回答

对于未声明的变量,typeof foo将返回字符串文字"undefined",而身份检查foo === undefined将触发错误“foo 未定义”

对于局部变量(您知道在某处声明),不会发生此类错误,因此需要进行身份检查。

@goreSplatter 你现在不能删除它。:-) 很难选择,但从问题的表述方式来看,这个答案更合适。任何对 undefined 一般如何工作感兴趣的人(就像我一样)也应该看看其他答案,尤其是@Tim 的。
2021-03-11 18:00:49
我会添加引号 ( typeof foo; // -> "undefined") 以强调它是一个字符串而不是原始值undefined
2021-03-21 18:00:49

我会坚持在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支票。

@Box9:我可以想象在库中使用它来检查另一个库的存在。
2021-03-12 18:00:49
@jontro:这就是不使用 JSLint 的原因之一。
2021-03-22 18:00:49
您可以定义var u = "undefined"并将其减少为typeof f==u,这会改善情况但仍然更大。
2021-03-29 18:00:49
好点,但我不确定typeof针对未声明变量的安全性是一个优势。如果有的话,它会让拼写错误更容易过去,而且我看不出您何时真正想要检查未声明变量的类型。
2021-03-29 18:00:49
谢谢蒂姆。你关于性能的观点是有道理的。jQuery 团队可能更关心对文件大小的影响。foo === undefined,当最小化时,可能类似于f===u,而typeof foo === "undefined"只能减少到typeof f==="undefined"
2021-04-10 18:00:49

使用 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,那么与是否使用 typeof 相比,您要处理的问题更大。
2021-03-12 18:00:49
无法在 ES5 中重新定义。
2021-03-14 18:00:49
全局undefined属性不能在 ES5 中重新定义,但仍然可以用局部变量遮蔽。void 0更短更安全。
2021-03-25 18:00:49

因为undefined并不总是声明的,但 jQueryundefined在其主函数中声明所以他们在undefined内部使用安全值,但在外部,他们使用typeof样式是安全的。

谁对 的性能增益感兴趣variable === undefined,可以看看这里,但它似乎只是一个 chrome 优化。