如何检查对象是否在 JavaScript 中具有特定属性?
考虑:
x = {'key': 1}; if ( x.hasOwnProperty('key') ) { //Do this }
这是最好的方法吗?
我真的对给出的答案感到困惑——其中大多数都是完全不正确的。当然,您可以拥有具有 undefined、null 或 false 值的对象属性。因此,简单地将属性检查减少到typeof this[property]甚至更糟,x.key会给您带来完全误导的结果。
typeof this[property]
x.key
这取决于你在寻找什么。如果您想知道一个对象是否在物理上包含一个属性(并且它不是来自原型链上的某个地方),那么object.hasOwnProperty就是要走的路。所有现代浏览器都支持它。(旧版本的 Safari - 2.0.1 和更早版本 - 但这些版本的浏览器已经很少使用了。)
object.hasOwnProperty
如果您要查找的是对象是否具有可迭代的属性(当您迭代对象的属性时,它会出现),那么执行:prop in object将为您提供所需的效果。
prop in object
由于 usinghasOwnProperty可能是您想要的,并且考虑到您可能需要一种备用方法,因此我向您提供以下解决方案:
hasOwnProperty
var obj = { a: undefined, b: null, c: false }; // a, b, c all found for ( var prop in obj ) { document.writeln( "Object1: " + prop ); } function Class(){ this.a = undefined; this.b = null; this.c = false; } Class.prototype = { a: undefined, b: true, c: true, d: true, e: true }; var obj2 = new Class(); // a, b, c, d, e found for ( var prop in obj2 ) { document.writeln( "Object2: " + prop ); } function hasOwnProperty(obj, prop) { var proto = obj.__proto__ || obj.constructor.prototype; return (prop in obj) && (!(prop in proto) || proto[prop] !== obj[prop]); } if ( Object.prototype.hasOwnProperty ) { var hasOwnProperty = function(obj, prop) { return obj.hasOwnProperty(prop); } } // a, b, c found in modern browsers // b, c found in Safari 2.0.1 and older for ( var prop in obj2 ) { if ( hasOwnProperty(obj2, prop) ) { document.writeln( "Object2 w/ hasOwn: " + prop ); } }
以上是一个可行的跨浏览器解决方案hasOwnProperty,但有一个警告:它无法区分原型和实例上的相同属性的情况 - 它只是假设它来自原型。您可以根据您的情况将其更改为更宽松或更严格,但至少这应该更有帮助。