下面
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
语句的工作方式相同。那么哪种方式更好?
答案 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应该更快。