2011-10-03 122 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; 
} 
相關問題