如何检查对象是否在JavaScript中有密钥?

1047 javascript object

哪个是正确的做法?

if (myObj['key'] == undefined)
Run Code Online (Sandbox Code Playgroud)

要么

if (myObj['key'] == null)
Run Code Online (Sandbox Code Playgroud)

要么

if (myObj['key'])
Run Code Online (Sandbox Code Playgroud)

For*_*ood 1848

尝试的JavaScript 运营商.

if ('key' in myObj)
Run Code Online (Sandbox Code Playgroud)

和逆.

if (!('key' in myObj))
Run Code Online (Sandbox Code Playgroud)

小心!in运营商匹配所有对象键,包括那些在对象的原型链.

使用myObj.hasOwnProperty('key')检查对象的自己的钥匙,将只返回true,如果key可以用myObj直接:

myObj.hasOwnProperty('key')
Run Code Online (Sandbox Code Playgroud)

除非您有特定的理由使用in运算符,否则使用myObj.hasOwnProperty('key')生成大多数代码正在查找的结果.

  • 'in'被认为不好的原因是因为它搜索整个原型链. (22认同)
  • 搜索整个原型链有什么问题(除非你知道你不想出于某种原因)? (5认同)
  • @reconbot,在普通的面向对象语言中,您经常调用父类中定义的方法。在 js 中做同样的事情有什么错?这是否意味着 js 原型链本身不好?有些人可能真的会使用它们。 (4认同)
  • 甚至更好 - if(myObj && 'key' in myObj) (3认同)
  • 可以做到这样Object.keys(ObjectInWhichYouwantTocheckTheKey).includes('keyInObject'):)欢呼 (2认同)
  • 应该避免使用 `hasOwnProperty` 并执行 `Object.prototype.hasOwnProperty.call(myObj, "key");` 如果您的对象具有名为 `hasOwnProperty` 的实际属性,或者更糟糕的是,如果客户端添加该属性,该怎么办?这是更多上下文:https://eslint.org/docs/rules/no-prototype-builtins (2认同)
  • @Nishant - 关注的是性能吗?因为否则似乎检查整个原型链是可取的......您之所以进行此检查,是因为您想在尝试访问它之前知道它是否存在,并且在必要时访问它将遍历整个原型链... (2认同)
  • @jononomo 及其他人:如果您将该对象用作地图,则会出现问题。例如,如果您想确保某个元素仅被写入一次并被更新的覆盖,并使用“in”,则您将无法存储与原型方法名称相同的键。 (2认同)

typ*_*ror 454

你应该用hasOwnProperty.例如:

myObj.hasOwnProperty('myKey');
Run Code Online (Sandbox Code Playgroud)

  • @maldy:这不是'拥有**自己的**财产'的全部意义吗? (215认同)
  • @CJBrew可能是因为你有eslint标志[no-prototype-builtins](http://eslint.org/docs/rules/no-prototype-builtins)在这种情况下你仍然可以通过`{}来使用它.hasOwnProperty.call(object,"key")` (12认同)
  • ESLint将此拒绝为"不要从目标对象访问Object.prototype方法'hasOwnProperty' (5认同)
  • 我要把这个留给任何想知道为什么ESLint抱怨https://eslint.org/docs/rules/no-prototype-builtins的人 (5认同)
  • 我在firefox中使用hasOwnProperty找到的一个问题是它将为继承密钥返回false (3认同)
  • 对于继承的密钥,您可以像这样检查 if(myObj.key.key) 如果存在则返回 true (2认同)