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

如何测试此Javascript对象是否具有任何属性?,javascript,Javascript,我有一些代码将属性添加到对象中,如下所示: var MyObject = new Object(); if (....) { MyObject.prop1 = .... ; } if (....) { MyObject.prop2 = .... ; } if (....) { MyObject.prop3 = .... ; } 看完所有这些if语句后,我想测试一下MyObject是否有属性。我不想测试它是否有prop1 | | prop2 | | prop3,因为可以添加12个属性 如何测试

我有一些代码将属性添加到对象中,如下所示:

var MyObject = new Object();

if (....) { MyObject.prop1 = .... ; }
if (....) { MyObject.prop2 = .... ; }
if (....) { MyObject.prop3 = .... ; }
看完所有这些if语句后,我想测试一下
MyObject
是否有属性。我不想测试它是否有
prop1 | | prop2 | | prop3
,因为可以添加12个属性

如何测试它是否至少有一个?我尝试了
if(MyObject)
,但这当然不起作用,因为这只测试对象的存在性。这些是否类似于对象的简单单行程序,如
(MyArray.length)

Object.getOwnPropertyNames(MyObject).length; 
这将为您提供对象自身属性的数量

Object.getOwnPropertyNames返回一个数组,其元素是与直接在obj上找到的可枚举和不可枚举属性相对应的字符串

如果您想支持没有
对象.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

如果您在ECMAScript 5之前的环境中工作,使用一个小循环就足够简单了:

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;
}
循环遍历对象的可枚举属性,包括对象本身的属性和从其原型继承的属性;告诉您属性是来自对象本身还是来自其原型。您要添加的所有属性都是可枚举的,因此它们将显示在循环中。原始对象(
{}
)最初没有可枚举属性,除非有人一直在处理
对象.prototype
(这是一个非常糟糕的主意),因此上面的第二个循环

ECMAScript5(几年前发布,较旧的浏览器不支持,即使在较新的浏览器中,支持也有所不同)添加了一些可用于此目的的函数。可能最相关的是,它返回对象“自己的”属性(而不是从其原型继承的属性)的名称数组。这意味着您不需要循环:

if (Object.keys(MyObject).length) { // Only on ES5-compliant browsers
    // Yes it has at least one
}

低于9的IE版本不支持这一点。这不是非常安全的代码;它可能在多个浏览器中失败。但这很酷。frenchie取决于您希望跨浏览器兼容的程度。@frenchie我更新了答案,以便在未定义
getOwnPropertyNames
的情况下包含回退实现。如果您需要支持较旧的浏览器(这是一个好主意):)。好的,这看起来更安全,因为跨浏览器兼容。我可以为(MyObject中的变量名){…?@frenchie:是的,你可以,它在语法上完全是好的。但是它有误导性:可能是