在JavaScript中如何检查一个对象是否具有某个键?

1925

哪个是正确的做法?

if (myObj['key'] == undefined)

或者

if (myObj['key'] == null)
或者
if (myObj['key'])

1
相关基准测试:https://jsperf.com/checking-if-a-key-exists-in-a-javascript-array - zurfyx
2
你可以尝试使用 !!myObj.key,它会返回 true(如果存在)和 false(如果不存在)。 - Anh-Thi DINH
12
@Anh-ThiDINH小心,这种方法不能用于布尔值。const user = { name: "John", admin: false }; !!user.name将返回true。 但是,即使存在'admin'键,!!user.admin将返回false。 - Tim Meehan
现在最好的写法是 myObj?.key。 - Jitendra Pal - JP
1
我在你的重复问题上投了#1700票 :) 做得好。 - WinEunuuchs2Unix
2个回答

3341

尝试使用JavaScript中的in运算符

if ('key' in myObj)

还有它的逆。

if (!('key' in myObj))

小心!in操作符会匹配对象原型链上的所有键。

使用myObj.hasOwnProperty('key')检查对象自身的键,只有在myObj直接包含key时才会返回true

myObj.hasOwnProperty('key')

除非你有特定原因要使用in运算符,否则使用myObj.hasOwnProperty('key')可以得到大多数代码所需要的结果。


97
“'in' 被认为不是很好的原因是因为它会搜索整个原型链。” - Nishant
6
更好的是,如果(myObj存在并且'myObj'对象中存在'key'属性)。 - pkdkk
33
搜索整个原型链有什么问题吗(除非你知道出于某种原因不想这样做)? - tadasajon
4
@reconbot,在普通的面向对象编程语言中,通常会调用父类定义的方法。在 JavaScript 中做同样的事情有什么问题吗?这是否意味着 JavaScript 的原型链本身是不好的?一些人可能会实际使用它们。 - Gherman
14
可以这样做:Object.keys(你想检查键的对象).includes('对象中的键') :) 干杯 - Usman Iqbal
显示剩余9条评论

862

你应该使用hasOwnProperty。例如:

myObj.hasOwnProperty('myKey');

注意: 如果您正在使用ESLint,上述内容可能会触发违反no-prototype-builtins规则的错误。在这种情况下,解决方法如下:

Object.prototype.hasOwnProperty.call(myObj, 'myKey');

3
在Firefox中,我发现hasOwnProperty存在一个问题,对于继承的键,它会返回false。 - Keval Malde
301
“hasOwnProperty”的整个意义不就在于此吗? - huysentruitw
17
ESLint 拒绝此操作,因为从目标对象访问 Object.prototype 方法 'hasOwnProperty' 是不允许的。 - CJBrew
18
可能是因为你在使用 eslint 的 no-prototype-builtins 标志,此时你仍然可以通过 {}.hasOwnProperty.call(object, "key") 来使用它。 - aug
24
我会把这个留在这里,供任何想知道为什么 ESLint 抱怨的人参考 https://eslint.org/docs/rules/no-prototype-builtins - JanithaR
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接