2012-01-03 84 views
6

我想測試一個對象是否爲空:{}。下面是通常用於:如何在Object.prototype被修改的情況下測試對象「isEmpty()」?

function isEmpty(obj) { 
    for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) 
     return false; 
    } 
    return true; 
} 

但假設Object原型加入如下:

Object.prototype.Foo = "bar"; 

測試:

alert(isEmpty({}));    // true 
Object.prototype.Foo = "bar"; 
alert({}.Foo);     // "bar" oh no... 
alert(isEmpty({}));    // true ...**huh?!** 

我試圖核武器攻擊對象的原型,改變它的構造函數,以及所有這些黑客行爲。沒有任何工作,但也許我做錯了(可能)。

+0

其實我剛剛意識到這個問題可能是錯誤的措詞,它應該是:_「如何測試一個原型鏈是否改變了_」? – 2012-01-03 05:25:00

+0

...我唯一能想到的方式就是硬編碼「對象」,「數字」,「數組」等所有屬性,並檢查已知屬性之外沒有任何內容。相當混亂。雖然我想在單元測試中做到這一點,但看到沒有人將某些東西塞進原始類型中,這一直是我一直懷疑的(因爲它可能會炸燬我的代碼,並且很難追查這個問題) 。 – 2012-01-03 05:33:28

+0

閱讀此:http://www.3site.eu/doc/ – diEcho 2012-01-03 06:02:05

回答

3

只需卸下obj.hasOwnProperty過濾器:

function isEmpty(obj) { 
    for (var prop in obj) { 
    return false; 
    } 
    return true; 
} 

DEMO

這樣,它還會告訴你,如果包含任何屬性或者如果有的話是在原型鏈,如果這就是你想要的。

或者你可以改變

if (obj.hasOwnProperty(prop)) 

if (!obj.hasOwnProperty(prop)) 

,如果你只是想知道如果事情是與它的原型搞亂。

+0

難道是...很簡單明顯嗎?我想知道爲什麼我的函數版本是最常用的版本(並在這個網站的幾十個答案中推薦)。這確實有效,但我想將其插入到我的測試中,以查看是否有任何意外的事情發生。 – 2012-01-03 06:04:04

+0

@PeterMarks:通常'hasOwnProperty'用於忽略繼承的屬性,但由於您對繼承的道具感興趣,因此過濾器會適得其反。 – qwertymk 2012-01-03 06:09:27

+0

FWIW,JSlint在刪除hasOwnProperty檢查時抱怨。不確定爲什麼。還有一件事我沒有得到。 – 2012-01-03 06:12:27

相關問題