如何在 JavaScript 中检查对象是否具有特定属性?
考虑:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}
这是最好的方法吗?
如何在 JavaScript 中检查对象是否具有特定属性?
考虑:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}
这是最好的方法吗?
我真的对给出的答案感到困惑 - 其中大多数完全不正确。当然,您可以拥有具有 undefined、null 或 false 值的对象属性。因此,简单地将属性检查减少到typeof this[property]或更糟,x.key会给您带来完全误导的结果。
这取决于你在寻找什么。如果你想知道一个对象是否物理上包含一个属性(并且它不是来自原型链上的某个地方),那么object.hasOwnProperty这就是要走的路。所有现代浏览器都支持它。(旧版本的 Safari 中缺少它 - 2.0.1 及更早版本 - 但这些版本的浏览器很少再使用了。)
如果您正在寻找的是一个对象是否具有可迭代的属性(当您迭代对象的属性时,它会出现),那么 do:prop in object会给您想要的效果。
由于 usinghasOwnProperty可能是您想要的,并且考虑到您可能需要回退方法,因此我向您提供以下解决方案:
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,有一个警告:无法区分原型和实例上的相同属性的情况 - 它只是假设它来自原型。根据您的情况,您可以将其更改为更宽松或更严格,但至少这应该更有帮助。
随着Underscore.js或(甚至更好)Lodash:
_.has(x, 'key');
哪个调用Object.prototype.hasOwnProperty,但是 (a) 输入更短,并且 (b) 使用“对”的安全引用hasOwnProperty(即,即使hasOwnProperty被覆盖也能工作)。
特别地,Lodash 定义_.has为:
function has(object, key) {
  return object ? hasOwnProperty.call(object, key) : false;
}
// hasOwnProperty = Object.prototype.hasOwnProperty
用:
var x = {
  'key': 1
};
if ('key' in x) {
  console.log('has');
}
注意:由于严格模式和hasOwnProperty. 正确的解决方案是使用严格模式并使用obj.hasOwnProperty. 这个答案早于这两件事,至少在广泛实施之前(是的,它是那么古老)。将以下内容作为历史记录。
请记住,如果您不使用严格模式,那么undefined它(不幸的是)不是JavaScript 中的保留字。因此,某人(显然是其他人)可能会有重新定义它的宏伟想法,从而破坏您的代码。
因此,更稳健的方法如下:
if (typeof(x.attribute) !== 'undefined')
另一方面,这种方法更冗长,也更慢。:-/
一种常见的方法是,以确保undefined被实际上未定义,例如,通过将代码置于它接受一个附加的参数的函数,称为undefined,使不通过的值。为确保它没有传递值,您可以立即自己调用它,例如:
(function (undefined) {
    … your code …
    if (x.attribute !== undefined)
        … mode code …
})();
if (x.key !== undefined)
Armin Ronacher似乎已经打败了我,但是:
Object.prototype.hasOwnProperty = function(property) {
    return this[property] !== undefined;
};
x = {'key': 1};
if (x.hasOwnProperty('key')) {
    alert('have key!');
}
if (!x.hasOwnProperty('bar')) {
    alert('no bar!');
}
正如Konrad Rudolph和Armin Ronacher指出的那样,一个更安全但更慢的解决方案是:
Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};