假设我宣布

var ad = {}; 

如何检查该对象是否包含用户定义的属性?


当前回答

for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

成员是指成员属性,成员变量,你可以叫它>_>

上面的代码将返回EVERYTHING,包括toString… 如果你只想查看对象的原型是否被扩展:

var dummyObj = {};  
for(var memberName in ad)
{
  if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
  //Member Name: memberName
  //Member Value: ad[memberName]

}

注A:我们检查虚拟对象的成员是否与测试对象的成员具有相同的类型。如果它是一个扩展,dummyobject的成员类型应该是"undefined"

其他回答

你可以循环遍历对象的属性,如下所示:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

使用hasOwnProperty()方法来确定对象是否将指定的属性作为直接属性,而不是从对象的原型链继承,这很重要。

Edit

来自注释:您可以将该代码放入函数中,并使其在到达有注释的部分时立即返回false

当确定对象是用户定义的对象时,确定UDO是否为空的最简单的方法是以下代码:

isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};

尽管这种方法(本质上)是一种演绎方法,-它是最快的,而且可能是最快的。

a={};
isEmpty(a) >> true

a.b=1
isEmpty(a) >> false 

注: 不要在浏览器定义的对象上使用它。

你可以使用内置的Object。方法获取对象上的键列表并测试其长度。

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length){
 // Your code here if x has some properties  
}
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist

简单,适用于每个浏览器,即使它在技术上是对对象上的所有键的循环,它也不会循环遍历所有键…要么有0,循环不运行,要么有一些,循环在第一个之后中断(因为我们只检查是否有ANY…那为什么还要继续呢?)

如果你愿意使用lodash,你可以使用some方法。

_.some(obj) // returns true or false

请看这个jsbin的小例子