我有一些代码可以为这样的对象添加属性:
var MyObject = new Object();
if (....) { MyObject.prop1 = .... ; }
if (....) { MyObject.prop2 = .... ; }
if (....) { MyObject.prop3 = .... ; }
在完成所有这些if语句后,我想测试并查看MyObject
是否具有属性。我不想测试它是否有prop1 || prop2 || prop3
,因为有12个属性可以添加。
如何测试它是否至少有一个?我试过if (MyObject)
,但当然这不起作用,因为它只测试对象的存在。对于对象来说,这些内容是否像(MyArray.length)
一样简单?
答案 0 :(得分:6)
如果您在ECMAScript5之前的环境中工作,那么通过一个小循环就可以轻松实现:
var found = false, name;
for (name in MyObject) {
if (MyObject.hasOwnProperty(name)) {
found = true;
break;
}
}
或者,由于您正在使用var MyObject = new Object();
创建它(顺便说一句,您可以使用var MyObject = {};
),因此您实际上不需要hasOwnProperty
来电:
var found = false, name;
for (name in MyObject) {
found = true;
break;
}
for..in
遍历对象的可枚举属性,包括它自己的属性和从它的原型继承的属性; hasOwnProperty
告诉您属性是来自对象本身还是原型。您添加的所有属性都是可枚举的,因此它们将显示在循环中。原始对象({}
)最初没有可枚举的属性,除非有人使用Object.prototype
(这是真的不好的主意),因此上面的第二个循环。
ECMAScript5(几年前发布,旧版浏览器不支持,即使在最近的浏览器中支持也有所不同)添加了一些可用于此的功能。可能最相关的是Object.keys
,它返回对象的“自己”属性的名称数组(不是它从原型继承的属性)。这意味着你不需要循环:
if (Object.keys(MyObject).length) { // Only on ES5-compliant browsers
// Yes it has at least one
}
答案 1 :(得分:2)
尝试
Object.getOwnPropertyNames(MyObject).length;
这将为您提供对象自身属性的数量。
请参阅documentation。
Object.getOwnPropertyNames返回一个数组,其元素是与obj上直接找到的可枚举和不可枚举属性相对应的字符串。
如果您想支持没有Object.getOwnPropertyNames
的旧版浏览器,请使用此功能:
var getPropertyNames = Object.getOwnPropertyNames || function(obj) {
var propNames = [];
for (var propName in obj) {
if(obj.hasOwnProperty(propName)) {
propNames.push(propName);
}
}
return propNames;
}
getPropertyNames(MyObject).length; // number of own properties