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

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

考虑:

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

这是做这件事的最好方法吗?


我对已经给出的答案感到困惑 - 他们中的大多数完全是错误的。 当然,您可以拥有未定义,空值或假值的对象属性。 所以简单地减少属性检查来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 …
})();
链接地址: http://www.djcxy.com/p/705.html

上一篇: How do I check if an object has a property in JavaScript?

下一篇: Length of a JavaScript object