使用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。我詢問在一次訪問網頁和未修改對象的情況下,訂單是否在多個枚舉的同一對象中保持一致。
當你創建一個測試用例在不同的瀏覽器中試用時會發生什麼? –
很確定這是不確定的行爲:你真的不應該依賴它來保證正確性。 –
@GeorgeStocker在Chrome和Firefox中,在我測試的小物件上,訂單是一致的。但是因爲我不能想到當對象沒有被觸及時改變順序的幕後原因,這對我來說並不奇怪。可能會有一些有趣的情況發生變化(例如,導致JIT切換到不同的哈希策略的許多讀取),但是我沒有觸發任何。 –