如何检查一个对象是否在 JavaScript 中具有property

请看︰

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

执行此操作的最佳方式是?

2008-09-25 19:27:06
问题评论:

我写了每个人的答案,看看这是最快的 jsperf 测试︰ jsperf.com/字典包含的键

回答:

我真的困惑的答案已指定-大多数都只是完全不正确。当然可以有对象属性具有未定义为空,或假值。只需简单减少属性检查到typeof this[property]或更糟的是, x.key将为您提供完全误导性结果。

这取决于您要寻找的内容。如果您想要知道如果对象实际包含的属性 (它不来自某处原型链上) object.hasOwnProperty将是路要走。所有现代浏览器都支持它。(它遗失在较早版本的 Safari-2.0.1 和旧的但几乎任何更多使用这些浏览器的版本。)

如果您要寻找什么是对象具有属性上它是 iterable (当您循环访问对象的属性,它将显示) 然后做︰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,有一点的工作,跨浏览器解决方案︰ 它不能区分情况下位置相同的属性是在原型和该实例上-它只是假定来自原型。您可以移动它更宽松或更严格,根据您的具体情况,但最起码,这应该是一种更有帮助。

我 humbled 的颜色。我曾不知道 object.hasOwnProperty 已经在大多数浏览器中的 exusted。很好,先生。

约翰,不应使用在 if() 分支函数声明。在此情况下,不允许的和当前的浏览器可以处理这些非常不同的方式。若要按条件创建函数,请使用函数表达式︰ var hasOwnProperty = 函数 () {...};

@Tomas,请参阅函数声明与函数表达式我改编 Kangax' 张三的代码的示例,请参阅JSBin在多个浏览器中 (至少在当前的镶边和 Opera),第一个函数声明是始终覆盖第二,无论情况如何。这意味着,在最好的情况下,第二个函数声明并不表示 hasOwnProperty支持本身。最坏的情况, hasOwnProperty不受支持,但第二个声明会尝试调用它。

很抱歉约翰,-1 表示没有提供安全的跨浏览器解决方案,请参见我上面的注释。;)

因此,问题的答案是...是的?我认为提问者有正确的答案吗?

使用lodashUnderscore.js或 (更好:

_.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

我猜测这是因为"添加此库"很少普遍使用的解决方案的问题是,关于复杂的 DOM 操作和答案是"转使用 jQuery"时,甚至。

我看到您点、 @sudowned、 表示感谢。顺便说一下,如果容许对包括整个 lodash 库之一无法编译子组件或npm install lodash.has公开只有has函数编译到 175 个字节时缩减 npm 模块。它也是见解看lodash.has/index.js看到的非常受欢迎和信任库的工作原理。

lodash版本配合︰ .has(undefined, 'someKey') => falseunderscore返回undefined

感谢 @BradParks-我有不实际看的underscore版本中,文档因此我相信这可能是有人阅读本文的有用点。

谢谢我已经附加了 lodash,开始前我应该过 RTFM 搜索周围的 @brian-m-hunt。

请记住该undefined是 (遗憾)没有JavaScript 中的保留字。因此,有人 (其他人,显然) 造成的总计思想的重新定义,换您的代码。

因此,一个更可靠的方法是下列︰

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

另一方面,此方法是详细得多,速度也较慢。:-/

一个常见的替代方案是为了确保该undefined实际上未定义的例如通过将代码放入接受额外的参数,调用undefined不是传递一个值的函数。为了确保它不具有传递值,您可以只是称其为自己立即,例如︰

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

只是好奇,因为void 0定义为返回规范undefined可以做x.attribute !== void 0?

我没有专家,Brian︰ 但是,确实似乎是恰到好处的聪明办法。

如果著名的他人重新定义什么定义,我认为最好的做法就是重写代码。

undefined = (function () {}()); if (a.attribute !== undefined) 'foo';

具有未定义的 var 的最佳是在闭包中,并具有不匹配的函数签名︰ (function (undefined) { // undefined is actually undefined here })();

是关于什么的?

var x = {'key': 1};

if('key' in x){
    console.log('has');
}

只是要注意,它适用于中的对象从狭义上讲,因此声明为 {} 创建或使用构造函数,它不接受数组或基元。不,OP 具有必需的但某些其他的答案提供更广泛的技术 (使用数组,字符串等。)

@РСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ 感谢您指出该出 (接受的答案不深入细节原因之一应使用in运算符,或不。此外请注意, in运算符具有很好的浏览器支持IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+ stackoverflow.com/questions/2920765/...

运算符in还检查对原型属性时hasOwnProperty循环访问用户定义的属性。引用︰ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...

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 RudolphArmin Ronacher将是︰

Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};

我不认为这是足够好。x.hasOwnProperty('toString') === true;

不提出反对,而是理解。有 x.hasOwnProperty,将返回任何东西除了布尔值 true 或 false 的任意点吗?如果不是,代码按过帐应工作每次。我想也许如果该方法被重写,但然后,依赖于结果永远不会可靠除非您知道该重写的方法。

我认为我们有通讯问题。我的意思是,使用您的方法,它会说,toString 是其自身的属性,但它不是。

请输入您的翻译

How do I check if an object has a property in JavaScript?

确认取消