2011-12-10 51 views
2

我有一些代碼,添加屬性,像這樣的對象:我該如何測試這個Javascript對象是否有任何屬性?

var MyObject = new Object(); 

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

經歷所有這些if語句,我想測試,看看MyObject是否有屬性之後。我不想測試它是否有prop1 || prop2 || prop3,因爲有12個屬性可以添加。

如何測試它是否至少有一個?我試過if (MyObject),但當然這不起作用,因爲它只測試對象的存在。這些東西就像一個簡單的單線程,如(MyArray.length)對象?

+0

可能重複[?如何檢查是否有對象在JavaScript中的任何屬性(http://stackoverflow.com/questions/2673121/how-to- check-if-object-has-any-properties-in-javascript) –

回答

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 
} 
+0

好的,這對於跨瀏覽器兼容性來說看起來更安全。我可以寫(var名稱在MyObject中){....? – frenchie

+0

@frenchie:是的,你可以,它在語法上完全不錯。這是誤導,但:* [[可憐,誤解var'](http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html)* –

+0

好的,謝謝TJ的幫助。 – frenchie

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 
+0

這不支持小於9的IE版本。 –

+0

好吧,非常酷的單行解決方案!謝謝。 – frenchie

+0

@Interstellar_Coder:它也適用於Chrome;它安全嗎? – frenchie

相關問題