JavaScript保證物件屬性的順序嗎?
P粉287254588
2023-08-17 17:04:41
<p>如果我這樣建立一個物件:</p>
<pre class="brush:php;toolbar:false;">var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";</pre>
<p>結果物件是否總是會像這樣? </p>
<pre class="brush:php;toolbar:false;">{ prop1 : "Foo", prop2 : "Bar" }</pre>
<p>也就是說,屬性的順序是否與我添加它們的順序相同? </p>
是的(但不總是按插入順序)。
大多數瀏覽器迭代物件屬性的順序如下:
一些舊版瀏覽器將類別1和類別2合併,並按插入順序迭代所有按鍵。如果您的鍵可能被解析為整數,最好不要依賴任何特定的迭代順序。
目前的語言規範(自ES2015以來)保留了插入順序,但在解析為正整數的鍵(例如“7”或“99”)的情況下,不同瀏覽器的行為會有所不同。例如,Chrome/V8在鍵被解析為數字時不遵守插入順序。
舊的語言規範(ES2015之前):迭代順序在技術上是未定義的,但所有主要瀏覽器都遵守了ES2015的行為。
請注意,ES2015的行為是語言規範受現有行為驅動的一個很好的例子,而不是反過來。要深入了解這種向後相容的思維方式,請參閱http://code.google.com/p/v8/issues/detail?id=164,這是一個詳細介紹Chrome迭代順序行為設計決策的Chrome錯誤報告。 根據該錯誤報告中的一則(相當主觀的)評論:
自從ES2015以來,物件的迭代順序遵循一定的規則,但是它並不總是遵循插入順序。簡而言之,迭代順序是字串鍵的插入順序和類似數字鍵的升序的組合:
使用陣列或
Map
物件可以更好地實現這一點。Map
與Object
有一些相似之處,而保證按插入順序迭代鍵,沒有例外:要注意的是,在ES2015之前,物件中的屬性順序根本不被保證。來自ECMAScript第三版(pdf)的物件定義: