typeof undefined。哪个更快更好?

时间:2014-01-10 04:44:56

标签: javascript performance undefined

下面

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

看起来上面的两个if-else语句的工作方式相同。那么哪种方式更好?

3 个答案:

答案 0 :(得分:2)

如果您正在寻找检查成员存在的方法,则应使用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应该优先选择成员。

答案 1 :(得分:0)

我会使用in运算符

if ('b' in a) {
    ...
}

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

然而,哪一个更快并不重要,因为你要进行微观优化(除非你的操作数百万或数十亿次)。

干杯

PS:c is not defined因为您c.b尝试访问未定义变量的b成员(c

答案 2 :(得分:0)

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

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

if(b.hasOwnProperty("c")) {

}

如果要在整个原型链中“查找”该属性,请使用in

if ("c" in b) {

}

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

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

注意

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