类型未定义。哪个更快更好? [复制]

Posted

技术标签:

【中文标题】类型未定义。哪个更快更好? [复制]【英文标题】:typeof undefined. Which is faster and better? [duplicate] 【发布时间】:2014-01-28 22:58:30 【问题描述】:

这里

var a = 

什么时候

if(typeof a.b == "undefined")
  console.log("undefined");


if (!a.b)
  console.log("undefined");

两者都返回"undefined" 以及何时

if(typeof c.b == "undefined")
  console.log("undefined");


if (!c.b)
  console.log("undefined");

两者都引发错误c is not defined

上面的 2 个 if-else 语句看起来是一样的。那么哪种方式更好呢?

【问题讨论】:

【参考方案1】:

如果您正在寻找一种方法来检查成员是否存在,您应该使用in 运算符

if ("b" in a) 
    ...

引发了错误c is not defined,因为c 没有在程序的任何地方定义。

typeof a.b 将返回的是存储在a.b 中的数据类型。如果b 确实存在并且它实际上拥有undefined 的值怎么办? typeof a.b!a.b 都将评估为真值。因此,它们不应该用于成员存在检查。

请查看this answer 了解为什么in 应该是会员存在的首选。

【讨论】:

昨天同样的问题xD @EdgarVillegasAlvarado 是的:P Dup 投票。【参考方案2】:

我会使用in 运算符

if ('b' in a) 
    ...

我会使用它,因为它完全用于检查对象中是否存在属性,并且因为它比其他属性更具可读性 (IMO)。

但是,哪个更快并不重要,因为您会进行微优化(除非您进行数百万或数十亿次操作)。

干杯

PS:c is not defined 发生是因为使用 c.b 您试图访问未定义变量 (c) 的 b 成员

【讨论】:

【参考方案3】:

我不确定您要达到什么目的,但有两个问题。第一部分是检查对象中定义的属性。第一个 if 是检查属性的类型是否已定义,但它可能是故意“未定义”。

用于检查对象是否具有属性。

if(b.hasOwnProperty("c")) 


如果您想“查找”整个原型链中的属性,请使用in

if ("c" in b) 


否则检查 b.c 是“未定义”意味着“b.c”返回的值是“未定义”类型。这并不意味着 b 具有或不具有属性“c”。

第二个块失败了,因为“c”没有在全局范围内定义。您无法访问将导致错误的未定义对象的属性。

注意

如果您没有原型链,hasOwnProperty 在大多数情况下应该更快。

【讨论】:

请记住,这会为对象原型中的属性返回 false。 我已经编辑了答案。

以上是关于类型未定义。哪个更快更好? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:未定义不是简单脚本上的函数

Javascript Handsontable - 未捕获的类型错误:无法读取未定义的属性“insertBefore”

GraphQL 错误:输入类型中未定义字段

为啥未定义 == 未定义但 NaN != NaN? [复制]

在 c++ 对象上使用 extern 时未定义的引用,但不是整数类型

未捕获的类型错误:运行 create-react-app 构建版本时无法读取未定义错误的属性“mountComponent”