2011-12-28 36 views
3

我有一種情況,我試圖使array工作,但我不認爲它會。我想擁有一個對象列表,每個對象都有一個唯一的ID,並且我希望能夠輕鬆引用特定對象,而無需遍歷搜索該ID的數組。JavaScript中的「for ... in」循環總是不好?

如果我使用object我可以很容易地使用唯一的ID作爲鍵和對象作爲值。但是,如果我使用對象而不是陣列,則必須使用for...in循環,並且我知道如果有人使用我的代碼擴展了Object.prototype,則會出現問題。

因此,這裏是我的問題:

難道真的那麼普遍,人們延長Object.prototype,我應該感到厭倦使用它呢?還有其他原因爲什麼我不想使用for...in循環?

另一方面,循環訪問一個數組尋找一個唯一的ID的性能打擊是如此之小以至於我不必擔心? (爲了記錄,數組可能只有很少的元素,但我會經常訪問它,而且我寫的代碼將是一個jQuery插件,所以我無法控制什麼其他惡意代碼的人將其與合併)

更新:

基於從@nnnnnn的意見,我成立了一個jsperf測試和這裏的結果: http://jsperf.com/accessing-object-properties-vs-iterating-over-arrays

基本上,儘管對象方式稍微快一些,但不同ce可以忽略不計。仍然,使用for...inhasOwnProperty似乎更清潔。

+1

號他們只是一般的「壞」當一個人使用過結構的*陣列*,與預期一對,每一個在其他語言。 (答案涵蓋其餘部分。) – 2011-12-28 03:18:41

回答

2

因此,這裏是我的問題:

難道真的那麼普遍,人們延長Object.prototype中,我應該使用感到厭倦呢?還有其他原因,爲什麼我不想使用for ... in循環?

不,它不常見,但確實發生。無論如何,你應該使用for..in循環,但使用.hasOwnProperty(),如其他答案所示。

我想不出的任何理由,而不是使用for..in(在一個對象上;顯然你不用它在一個數組上)。

另一方面,循環訪問一個數組尋找一個唯一的ID的性能打擊是如此之小以至於我不必擔心?

那麼你提到你的數組不會有很多因素,但我仍然認爲,即使它表現良好,將不必要的足夠複雜的代碼因爲你沒有做到這一點在所有的對象。另一方面,使用.hasOwnProperty()是一個小問題,它有效地成爲每個for..in語法的一部分。

您可以設置的性能在這裏的測試:http://jsperf.com/

5

即使有人確實擴展了原型,也可以使用hasOwnProperty屬性來排除這些成員。 This is exactly what Sugar.js recommends

var s = 'cat', key; 
for(key in s) { 
    if(s.hasOwnProperty(key)) { 
    console.log(key); 
    } 
} 

現在根據糖,for..in是對象常量接受環,但你也可以使用一個迭代器像$.each的jQuery或_.each的Underscore.js。

+0

'hasOwnProperty'只適用於從Object繼承的對象。我知道我可以做到這一點,但我真的希望找到一個不涉及創建新「班級」的解決方案。我也希望能夠從性能的角度回答關於從數組vs對象迭代的問題。 – 2011-12-28 03:22:42

+2

@Philip Walton - 等等,什麼?你有沒有從'Object'繼承的對象?爲什麼你認爲你需要創建一個新的「類」來使用'.hasOwnProperty()'? – nnnnnn 2011-12-28 03:25:26

+0

@nnnnnn Doh!感謝您指出了這一點。我錯誤地認爲'hasOwnProperty'不適用於對象文字,而只適用於從'Objecet'類繼承的其他對象。 – 2011-12-28 03:33:38

2

您可以在for..in循環中使用hasOwnProperty方法來區分原型鏈中與指定給對象的東西相比更遠的東西。

或者您可以保留您自己的分配給給定對象的「鍵」列表。