类型未定义。哪个更快更好? [复制]
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”
为啥未定义 == 未定义但 NaN != NaN? [复制]
在 c++ 对象上使用 extern 时未定义的引用,但不是整数类型
未捕获的类型错误:运行 create-react-app 构建版本时无法读取未定义错误的属性“mountComponent”