84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
如果我創建一個像這樣的物件:
var obj = {}; obj.prop1 = "Foo"; obj.prop2 = "Bar";
產生的物件總是看起來像這樣嗎?
{ prop1 : "Foo", prop2 : "Bar" }
也就是說,屬性的順序是否與我添加它們的順序相同?
是(但不總是插入順序)。
大多數瀏覽器將物件屬性迭代為:
一些較舊的瀏覽器將類別 #1 和 #2 結合起來,按插入順序迭代所有按鍵。如果您的鍵可能解析為整數,那麼最好不要依賴任何特定的迭代順序。
目前語言規範(自ES2015 起)插入順序將被保留,但解析為正整數(例如「7」或「99」)的按鍵除外,瀏覽器在這種情況下的行為會有所不同。例如,當鍵解析為數字時,Chrome/V8 不考慮插入順序。
舊語言規範(ES2015 之前):迭代順序在技術上未定義,但所有主要瀏覽器都遵守 ES2015 行為。
請注意,ES2015 行為是語言規範由現有行為驅動的一個很好的例子,而不是相反。要更深入了解向後相容的心態,請參閱http:// code.google.com/p/v8/issues/detail?id=164,一個Chrome 錯誤,詳細介紹了Chrome 迭代順序行為背後的設計決策。 根據該錯誤報告的(相當固執己見的)評論之一:
自 ES2015 以來,物件的迭代順序遵循一組特定規則,但它並不(總是) ) 遵循插入順序。簡單地說,迭代順序是字串鍵的插入順序和類似數字的鍵的升序的組合:
// key order: 1, foo, bar const obj = { "foo": "foo", "1": "1", "bar": "bar" }
使用陣列或Map object可能是實現此目的的更好方法。Map與Object和保證按插入順序迭代鍵,沒有例外:
Map object
Map
Object
要注意的是,在 ES2015 之前根本無法保證物件中的屬性順序。物件的定義來自ECMAScript 第三版 (pdf):
是(但不總是插入順序)。
大多數瀏覽器將物件屬性迭代為:
一些較舊的瀏覽器將類別 #1 和 #2 結合起來,按插入順序迭代所有按鍵。如果您的鍵可能解析為整數,那麼最好不要依賴任何特定的迭代順序。
目前語言規範(自ES2015 起)插入順序將被保留,但解析為正整數(例如「7」或「99」)的按鍵除外,瀏覽器在這種情況下的行為會有所不同。例如,當鍵解析為數字時,Chrome/V8 不考慮插入順序。
舊語言規範(ES2015 之前):迭代順序在技術上未定義,但所有主要瀏覽器都遵守 ES2015 行為。
請注意,ES2015 行為是語言規範由現有行為驅動的一個很好的例子,而不是相反。要更深入了解向後相容的心態,請參閱http:// code.google.com/p/v8/issues/detail?id=164,一個Chrome 錯誤,詳細介紹了Chrome 迭代順序行為背後的設計決策。 根據該錯誤報告的(相當固執己見的)評論之一:
自 ES2015 以來,物件的迭代順序遵循一組特定規則,但它並不(總是) ) 遵循插入順序。簡單地說,迭代順序是字串鍵的插入順序和類似數字的鍵的升序的組合:
使用陣列或
Map object
可能是實現此目的的更好方法。Map
與Object
和保證按插入順序迭代鍵,沒有例外:要注意的是,在 ES2015 之前根本無法保證物件中的屬性順序。物件的定義來自ECMAScript 第三版 (pdf):