变量=== undefined vs. typeof variable ==="undefined"

Pat*_*ney 289 javascript jquery undefined

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

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

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

Lin*_*een 350

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

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

  • @goreSplatter你现在无法删除它.:-)很难选择,但问题的表达方式,这个答案更合适.任何对未定义如何工作感兴趣的人(就像我一样)也应该看看其他答案,尤其是@Tim's. (3认同)
  • 我会添加引号(`typeof foo; // - >"undefined"`)来强调它是一个字符串而不是原始值`undefined`. (3认同)

Tim*_*own 112

我坚持在typeof foo === "undefined"任何地方使用.这永远不会出错.

我想象jQuery推荐两种不同方法的原因是它们undefined在jQuery代码所在的函数中定义了自己的变量,因此在该函数中undefined可以安全地从外部篡改.我还想象某个地方有人对这两种不同的方法进行了基准测试,并发现它foo === undefined更快,因此决定了它的出路.[更新:如评论中所述,比较undefined也略短,这可能是一个考虑因素.] 然而,实际情况下的收益将是微不足道的:这种检查永远不会是任何瓶颈,什么你输了很重要:评估一个主机对象的属性进行比较会抛出一个错误,而一个typeof检查永远不会.

例如,IE中使用以下内容来解析XML:

var x = new ActiveXObject("Microsoft.XMLDOM");
Run Code Online (Sandbox Code Playgroud)

要检查它是否loadXML安全有方法:

typeof x.loadXML === "undefined"; // Returns false
Run Code Online (Sandbox Code Playgroud)

另一方面:

x.loadXML === undefined; // Throws an error
Run Code Online (Sandbox Code Playgroud)

UPDATE

typeof我忘记提到的检查的另一个优点是它也适用于未声明的变量,foo === undefined检查没有,实际上抛出了ReferenceError.感谢@LinusKleen提醒我.例如:

typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError
Run Code Online (Sandbox Code Playgroud)

底线:始终使用typeof支票.

  • 谢谢蒂姆.关于性能的观点是有道理的.jQuery团队可能更关注对文件大小的影响.`foo === undefined`,当最小化时,可能类似于`f === u`,而`typeof foo ==="undefined"`只能简化为`typeof f ==="undefined"`. (10认同)
  • 好点,但我不确定`typeof`对未声明变量的安全性是一个优势.如果它有什么东西让错别字更容易滑过,我看不清你何时想要检查未声明变量的类型. (5认同)
  • @ Box9:我可以想象在一个库中使用它来检查另一个库的存在。 (2认同)
  • @jontro:那是不使用JSLint的原因之一. (2认同)

Jak*_*kob 28

使用typeof-variant的另一个原因是:undefined可以重新定义.

undefined = "foo";
var variable = "foo";
if (variable === undefined)
  console.log("eh, what?!");
Run Code Online (Sandbox Code Playgroud)

结果typeof variable 不能.

更新:请注意,在ES5中并非如此.

  • 无法在ES5中重新定义. (17认同)
  • 全局`undefined`属性不能在ES5中重新定义,但仍然可以用局部变量进行阴影处理.`void 0`更短更安全. (6认同)
  • 我想说,如果你的代码重新定义了 undefined,那么你需要处理的问题比是否使用 typeof 更大。 (2认同)

小智 6

因为undefined并不总是声明,但jQuery undefined在其main函数中声明.所以他们在undefined内部使用安全值,但在外面,他们使用typeof风格是安全的.


RiZ*_*KiT 5

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