协慌网

登录 贡献 社区

如何检查对象是否在 JavaScript 中具有属性?

如何检查对象是否在 JavaScript 中具有属性?

考虑:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

这是最好的方法吗?

答案

我对给出的答案感到困惑 - 大多数答案都是完全不正确的。当然,您可以拥有具有 undefined,null 或 false 值的对象属性。所以简单地将属性检查减少到typeof this[property]或者更糟糕的是, x.key会给你带来完全误导性的结果。

这取决于你在寻找什么。如果你想知道一个对象是否物理上包含一个属性(并且它不是来自原型链上的某个地方),那么object.hasOwnProperty就是你要走的路。所有现代浏览器都支持它。 (在旧版本的 Safari - 2.0.1 及更早版本中缺少它 - 但是这些版本的浏览器很少被使用。)

如果你正在寻找的是一个对象上有一个可迭代的属性(当你迭代对象的属性时,它会出现)然后做: prop in object会给你你想要的效果。

由于使用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一个有效的跨浏览器解决方案,但有一点需要注意:它无法区分原型和实例上相同属性的情况 - 它只是假设它来自原型。根据你的情况,你可以把它转移到更宽松或更严格的程度,但至少这应该更有帮助。

随着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

注意 :由于严格模式和hasOwnProperty ,以下现在基本上已经过时了。正确的解决方案是使用严格模式并使用obj.hasOwnProperty检查属性的存在。这个答案早于这两个方面,至少广泛实施(是的,它是旧的)。请将以下内容作为历史记录。


请记住,如果您没有使用严格模式, undefined (不幸的是) 不是 JavaScript 中的保留字。因此,某人(显然是其他人)可能会有重新定义它的宏伟想法,破坏您的代码。

因此,更强大的方法如下:

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

另一方面,这种方法更冗长,也更慢。 : - /

一个常见的替代方法是确保undefined 实际上是未定义的,例如将代码放入一个函数中,该函数接受一个名为undefined的附加参数,该参数不传递值。为了确保它没有传递一个值,你可以立即自己调用它,例如:

(function (undefined) {
    … your code …
    if (x.attribute !== undefined)
        … mode code …
})();