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


311

我如何确定对象x是否具有定义的属性y,而不管其值如何x.y

我目前正在使用

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

但这似乎有些笨拙。有没有更好的办法?

Answers:


584

对象具有属性:

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

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

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

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

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

23
甚至更好- Object.prototype.hasOwnProperty.call(x, 'y')以便名为“ hasOwnProperty”的属性不会与检查过程冲突;)
kangax

4
甚至更短- {}.hasOwnProperty.call(x, 'y')
axmrnv

78

如果您想知道对象是否实际包含属性@gnarf的答案,则hasOwnProperty可以完成工作。

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

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

例如。:

var obj = {};

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

18

Underscore.js或Lodash

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

:)


不。它只是的别名Object.prototype.hasOwnProperty.call(x, "y")。对于数组我想你可能想Array.prototype.indexOf_.indexOf或者_.contains
nackjicholson

13

您可以这样整理:

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

15
那会失败的x = {y:undefined}
詹姆斯

20
是否有人需要区分“未定义”和“已定义为未定义”?
jpsimons

16
@darkporter我有时会做;)
mmm

6

我原始代码的一个功能

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

在某些情况下可能有用的是使用是否x存在是安全的。使用gnarf答案中的任何一种方法,都应该首先测试x是否存在疑问。

因此,也许所有这三种方法都可以胜任。


你总是可以使用(x && x.hasOwnProperty('y'))(x && 'y' in x)
gnarf

我同意,对x的测试应单独进行。还可以产生更好的错误报告。
b01

那对我来说失败了。如果x未定义,则typeof(xy)返回a ReferenceError而不是字符串“ undefined”
Craig 2014年

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

-2

为什么不简单地:

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

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

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

1
因为它不好读并且不严格输入。我必须问你:为什么不简单x.hasOwnProperty('y')
Fabian Picone
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.