如何在 JavaScript 中检查对象是否有键?[复制]

How do I check if an object has a key in JavaScript? [duplicate]

提问人: 提问时间:1/18/2009 最后编辑:Zanon 更新时间:1/9/2020 访问量:2067175

问:

哪个是正确的做法?

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

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

if (myObj['key'])
JavaScript 对象

评论

1赞 zurfyx 1/7/2017
相关基准:jsperf.com/checking-if-a-key-exists-in-a-javascript-array
2赞 Anh-Thi DINH 4/9/2021
您可以尝试返回(如果 in)和 (if not)。!!myObj.keytruefalse
12赞 Tim Meehan 6/16/2021
@Anh-ThiDINH 请注意,这不适用于布尔值。 将返回 true。但即使“admin”密钥存在,也会返回 falseconst user = { name: "John", admin: false }; !!user.name!!user.admin
0赞 Jitendra Pal - JP 5/11/2022
现在最好是 myObj?。钥匙
1赞 WinEunuuchs2Unix 5/30/2022
我对你的重复问题投票#1700:)干的好。

答:

861赞 typeoneerror 1/18/2009 #1

应使用 hasOwnProperty。例如:

myObj.hasOwnProperty('myKey');

注意:如果您使用的是 ESLint,上述情况可能会因违反 no-prototype-builtins 规则而出现错误,在这种情况下,解决方法如下:

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

评论

3赞 Keval Malde 10/17/2013
我在firefox中发现hasOwnProperty的一个问题是它将返回继承的密钥的false。
301赞 huysentruitw 1/8/2014
@maldy:这难道不是重点吗?has**Own**Property
17赞 CJBrew 9/28/2016
ESLint 拒绝了这一点,因为Do not access Object.prototype method 'hasOwnProperty' from target object.
18赞 aug 3/3/2017
@CJBrew这可能是因为您有 eslint 标志 no-prototype-builtins,在这种情况下,您仍然可以通过执行以下操作来使用它{}.hasOwnProperty.call(object, "key")
24赞 JanithaR 5/16/2019
我将把这个留给任何想知道为什么 ESLint 抱怨 eslint.org/docs/rules/no-prototype-builtins 的人
3339赞 ForYourOwnGood 1/19/2009 #2

尝试 JavaScript in 运算符

if ('key' in myObj)

反之亦然。

if (!('key' in myObj))

小心!运算符匹配所有对象键,包括对象原型链中的键。in

用于检查对象自己的键,并且仅当 可用时才会返回:myObj.hasOwnProperty('key')truekeymyObj

myObj.hasOwnProperty('key')

除非您有使用运算符的特定原因,否则 using 将生成大多数代码所寻找的结果。inmyObj.hasOwnProperty('key')

评论

96赞 Nishant 12/29/2014
“in”之所以被认为不好,是因为它搜索了整个原型链。
6赞 pkdkk 9/3/2015
甚至更好 - if(myObj & myObj 中的 'key')
33赞 tadasajon 11/7/2015
搜索整个原型链有什么问题(除非您知道出于某种原因不想这样做)?
4赞 Gherman 12/26/2015
@reconbot,在普通的面向对象语言中,您经常调用父类中定义的方法。在 js 中做同样的事情有什么问题?这是否意味着 js 原型链本身是坏的?有些人可能真的会使用它们。
14赞 Usman Iqbal 8/16/2018
可以像这样做 Object.keys(ObjectInWhichYouwantTocheckTheKey).includes('keyInObject') :)干杯