2016-03-08 36 views
3

使用for .. in循環遍歷對象的成員時,枚舉順序爲is implementation defined。但是,假設對象沒有被修改,在相同的頁面訪問期間,在相同的瀏覽器中迭代兩次,保證給出相同的順序?javascript是否保證枚舉相同的對象兩次將按照相同的順序遍歷字段?

這是測試我正在談論的屬性的示例代碼。現在的問題歸結爲一個瀏覽器是否可能拋出「不一樣」:

a = [] 
b = [] 
for (var e in obj) 
    a.push(e); 
for (var e in obj) 
    b.push(e); 

// Are a and b's contents now the same? 
// Or is the same-ness implementation defined? 
for (var i = 0; i < a.length; i++) 
    if (a[i] !== b[i]) 
    throw "not the same"; 

我很感興趣,雙方按照規範,在現有的瀏覽器做法的答案。

要清楚,我不是要求whether the order is consistent across browsers。我詢問在一次訪問網頁和未修改對象的情況下,訂單是否在多個枚舉的同一對象中保持一致。

+1

當你創建一個測試用例在不同的瀏覽器中試用時會發生什麼? –

+4

很確定這是不確定的行爲:你真的不應該依賴它來保證正確性。 –

+0

@GeorgeStocker在Chrome和Firefox中,在我測試的小物件上,訂單是一致的。但是因爲我不能想到當對象沒有被觸及時改變順序的幕後原因,這對我來說並不奇怪。可能會有一些有趣的情況發生變化(例如,導致JIT切換到不同的哈希策略的許多讀取),但是我沒有觸發任何。 –

回答

2

不是。正如文檔所述,它是依賴於實現的。這是不太可能如果它沒有被修改,一個實現將以不同的順序返回相同的對象,但沒有保證。另一方面,

A Set object將「按照插入順序迭代其元素」。

+0

一組記錄插入順序的集合嗎?我想我們把這個名單叫做一個名單。嗯... – Alex

+0

@Alex會員資格測試仍然便宜,並且不支持快速訪問索引;所以這是一個很好的設置。從一開始就有一個一致的迭代順序是一個很好的設計理念,因爲即使你有文檔說他們不應該這樣做,人們仍然有依賴實現怪癖的這種令人討厭的傾向。 –

相關問題