如何测试此Javascript对象是否具有任何属性?

时间:2011-12-10 20:31:58

标签: javascript

我有一些代码可以为这样的对象添加属性:

var MyObject = new Object();

if (....) { MyObject.prop1 = .... ; }
if (....) { MyObject.prop2 = .... ; }
if (....) { MyObject.prop3 = .... ; }

在完成所有这些if语句后,我想测试并查看MyObject是否具有属性。我不想测试它是否有prop1 || prop2 || prop3,因为有12个属性可以添加。

如何测试它是否至少有一个?我试过if (MyObject),但当然这不起作用,因为它只测试对象的存在。对于对象来说,这些内容是否像(MyArray.length)一样简单?

2 个答案:

答案 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