2011-10-03 120 views
1

如果我设置使用对象:如何判断对象是否为空?

var a = {}; 

var a = new Object(); 

我怎样才能测试它是否具有里面任何东西,如果我不知道具体要测试什么。

(有点像== {},但这并不能正确地评价)

+0

如果你的目标IE8及以下检查我的回答,接受的答案不参与帐户IE的DontEnum错误...干杯! – CMS

回答

4

你可以使用这个简单的功能:

function isEmpty(object) { 
    for(var property in object) { 
     if(object.hasOwnProperty(property)) 
      return false; 
    } 

    return true; 
} 

但是,如果你使用jQuery:http://api.jquery.com/jQuery.isEmptyObject/

+0

完美! JS方法和以前我不熟悉的jQuery方法都很好。谢谢! – Maxx

1

在您可以使用ECMAScript 5:

if (Object.keys(a).length === 0) { 
    ... 
} 

注意:这只会发现enumerable属性。

+0

这似乎不适合我。我得到的对象和对象未定义的语法错误。也许你可以详细说明这一点? – Maxx

+0

@Maxx您需要一个现代浏览器才能获得ES5支持。如果你没有,可以模拟这个函数 - 参见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys – Alnitak

2

这似乎是一个无辜的问题,一个简单的解决方案就像@SiteSafeNL提供的一个简单的解决方案似乎可以工作,但是存在一个实施错误,并不考虑在内,IE {DontEnum} Bug

如果你的目标IE8及以下你将需要实现这样的事情:

var isEmpty = (function() { 
    var hasOwn = Object.prototype.hasOwnProperty, 
     hasDontEnumBug = !{toString:0}.propertyIsEnumerable("toString"), 
     dontEnums = ['toString', 'toLocaleString', 
      'valueOf', 'hasOwnProperty', 
      'isPrototypeOf', 'propertyIsEnumerable', 
      'constructor']; 


    return function (o) { 
     for (var p in o) { 
      if (hasOwn.call(o, p)) 
       return false 
     } 

     if (hasDontEnumBug) { // IE8 and below 
      var i = dontEnums.length; 
      while(i--) { 
       if (hasOwn.call(o, dontEnums[i])) 
        return false; 
      } 
     } 

     return true; 
    }; 
})(); 

现在实现的ECMAScript 5作为@Alnitak提到你可以使用Object.keys现代浏览器,但在ES5现在我们有限定非枚举的属性的功率,这些特性将不会出现在for-in环,如果需要检测它们,必须使用替代方法,例如,使用上述功能,或Object.keys

var obj = Object.create(null, { foo: { value: 1, /* enumerable:false... */} }); 
isEmpty(obj); // true 
Object.keys(obj).length; // 0 

// But the property exists: 
obj.hasOwnProperty('foo'); // true 
obj.foo; // 1 

我们需要另一种方法,如果你想赶上不可枚举自己的属性,这就是为什么Object.getOwnPropertyNames方法存在:

function isEmpty(obj) { 
    return Object.getOwnPropertyNames(obj).length == 0; 
} 
相关问题