!obj[key] 是检查 JavaScript 中对象的 属性 是否存在的好习惯吗?

Is !obj[key] a good practice to check the existence of an object's property in JavaScript?

我时不时地看到这个模式:

if (!obj[key]) {
    // key does not exist inside object
    obj[key] = ...
} else {
    // maybe do something else with obj[key]
}

但我发现它非常错误。如果实际上 obj[key] 的值为 false'' 怎么办? 那么代码对我来说没有任何意义。

为什么我经常看到这个?为什么人们不使用 .hasOwnProperty() 来检查 key 是否作为对象的 属性 存在?

您应该使用 in 运算符:

"key" in obj // true, regardless of the actual value

如果您想特别测试对象实例的属性(而不是继承的属性),请使用 hasOwnProperty:

obj.hasOwnProperty("key") // true

对于 hasOwnProperty 和 key 未定义的方法之间的性能比较,请检查此 reference

你是对的,如果你正在检查 key 属性是否存在,那么绝对不应该使用它,有更好的选择,例如 .hasOwnPropertyin 运算符,例如:

const obj = { a: '' }

console.log('is key a in obj?', obj.hasOwnProperty('a'))
>>> true
console.log('is key a in obj?', 'a' in obj)
>>> true
console.log('is key a in obj?', Boolean(obj['a']))
>>> false // it's wrong, like u mentioned

console.log('is key b in obj', obj.hasOwnProperty('b'))
>>> false
console.log('is key b in obj', 'b' in obj)
>>> false
console.log('is key b in obj', Boolean(obj['b']))
>>> false