如何确定对象在JavaScript中是否具有给定属性

时间:2009-12-12 21:41:18

标签: javascript object

如何确定对象x是否具有已定义的属性y,而不管x.y的值是什么?

我正在使用

if (typeof(x.y) !== 'undefined')

但这看起来有点笨重。还有更好的方法吗?

11 个答案:

答案 0 :(得分:504)

对象具有属性:

如果您正在测试对象本身的属性(不是其原型链的一部分),您可以使用.hasOwnProperty()

if (x.hasOwnProperty('y')) { 
  // ......
}

对象或其原​​型具有属性:

您可以使用in运算符来测试继承的属性。

if ('y' in x) {
  // ......
}

答案 1 :(得分:69)

如果您想知道对象物理是否包含属性@gnarf's,请使用hasOwnProperty进行回答。

如果您想知道该属性是否存在于对象本身或原型链中的任何位置,您可以使用in operator

if ('prop' in obj) {
  // ...
}

例如:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically

答案 2 :(得分:13)

Underscore.js或Lodash

if (_.has(x, "y")) ...

:)

答案 3 :(得分:12)

你可以这样修剪一下:

if ( x.y !== undefined ) ...

答案 4 :(得分:5)

我原始代码的一个功能

if ( typeof(x.y) != 'undefined' ) ...
在某些情况下可能有用的

是使用x是否存在是安全的。使用gnarf的答案中的任何一种方法,如果存在任何疑问,应首先测试x

所以也许所有这三种方法都有其中一个技巧。

答案 5 :(得分:2)

包括

Object.keys(x).includes('y');

Array.prototype.includes() 方法确定数组是否在其条目中包含某个值,并根据需要返回 true 或 false。

Object.keys() 返回一个字符串数组,表示给定对象的所有可枚举属性。

.hasOwnProperty() 和 ES6+ .? -optional-chaining like: if (x?.y) 也是非常好的 2020+ 选项。

答案 6 :(得分:1)

由于问题是关于属性检查的笨拙,以及一个用于验证函数参数选项对象的常规用例,我想我会提到一种无库的测试存在多个属性的简短方法。 免责声明:它确实需要ECMAScript 5(但IMO仍然使用IE8的人应该使用破碎的网页)。

function f(opts) {
  if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
      throw new Error("IllegalArgumentException");
  }
  alert("ok");
}
f({req1: 123});  // error
f({req1: 123, req2: 456});  // ok

答案 7 :(得分:0)

ES6 +:

ES6 +上有一项新功能,您可以通过以下方式对其进行检查:

if (x?.y)

实际上,解释器会检查x的存在,然后调用y,由于在if括号中加上了强制,因此x?.y转换为布尔值。 / p>

答案 8 :(得分:0)

const data = [{"b":1,"c":100},{"a":1,"b":1,"c":150},{"a":1,"b":2,"c":100},{"a":2,"b":1,"c":13}]

const result = data.reduce((r, e)  => {
  r['a'] += (e['a'] ? e['a'] : 0)
    r['d'] += (e['b'] ? e['b'] : 0)
  r['c'] += (e['c'] ? e['c'] : 0)

  return r
}, {'a':0, 'd':0, 'c':0})

console.log(result)
`result` { a: 4, d: 5, c: 363 }

答案 9 :(得分:-1)

为什么不简单:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

或者如果您期望特定类型:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");

答案 10 :(得分:-4)

我想知道名为foo的对象是否具有我简单使用的名为bar的属性

if(foo.bar){
  //do stuff
}

如果该属性不存在,则Javascript返回false。在某些情况下,这是不正确的。例如,如果bar期望是布尔值或可以等于零的数字。Everything without a value is false.

否则,我认为它是最优雅的解决方案。