如何检查一个对象是否在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?