如何确定一个对象是否在JavaScript中有一个给定的属性

不pipexy的值如何确定一个对象x是否有一个定义的属性y

我目前正在使用

 if (typeof(xy) !== 'undefined') 

但这似乎有点笨重。 有没有更好的办法?

对象有属性:

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

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

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

您可以使用in运算符来testinginheritance的属性。

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

如果你想知道对象物理上是否包含属性@ gnarf的答案使用hasOwnProperty将做的工作。

如果您想知道属性是否存在,无论是在对象本身还是在原型链中,都可以使用in运算符 。

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

例如。:

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

你可以修改这个有点像这样:

 if ( xy !== undefined ) ... 

Underscore.js或Lodash

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

🙂

我原来的代码的一个特点

 if ( typeof(xy) != 'undefined' ) ... 

这在某些情况下可能是有用的,因为x是否存在是安全的。 用gnarf的答案中的任何一种方法,如果存在任何疑问,应首先testingx

所以也许所有这三种方法都有一个诀窍。

这里是我写这个对象 – hasOwnProperty可重用组件来检查一个对象是否具有属性dproperty,返回一个布尔值:

 function hasOwnProperty(obj: {}, prop: string|number): boolean { return Object.prototype.hasOwnProperty.call(obj, prop); }; 

它没有上升到原型链,这里是相关的例子:

 hasOwnProperty({foo: 'bar'}, 'foo') // => true hasOwnProperty({foo: 'bar'}, 'bar') // => false 

还添加了3个testing来显示它如何处理不同的用例(具有值,没有值,为空)

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

 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 

为什么不简单:

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

或者如果你期望一个特定的types:

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