JavaScript是否保證物件屬性的順序?
P粉604848588
P粉604848588 2023-08-20 17:42:13
0
2
463
<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>
P粉604848588
P粉604848588

全部回覆(2)
P粉894008490

是的(但不總是按照插入順序)。

大多數瀏覽器迭代物件屬性的順序如下:

  1. 正整數鍵依升序排列(以及像「1」這樣解析為整數的字串)
  2. 字串鍵按插入順序排列(ES2015保證了這一點,所有瀏覽器都遵守)
  3. 符號名稱按插入順序排列(ES2015保證了這一點,所有瀏覽器都遵守)

一些舊版瀏覽器將類別1和類別2結合起來,並按插入順序迭代所有鍵。如果您的鍵可能解析為整數,最好不要依賴任何特定的迭代順序。

當前語言規範(自ES2015起)保留了插入順序,但對於解析為正整數的鍵(例如“7”或“99”)的行為在不同瀏覽器之間有所不同。例如,Chrome/V8在鍵解析為數字時不遵守插入順序。

舊語言規範(ES2015之前):迭代順序在技術上是未定義的,但所有主要瀏覽器都遵守了ES2015的行為。

請注意,ES2015的行為是語言規範受現有行為驅動的一個很好的例子,而不是相反。要更深入了解這種向後相容的思維方式,請參閱http://code.google.com/p/v8/issues/detail?id=164,這是一個詳細介紹Chrome迭代順序行為設計決策的Chrome錯誤報告。 根據該錯誤報告中的一個(相當主觀)評論:

P粉574695215

物件的迭代順序自ES2015起遵循一定的規則,但它不總是遵循插入順序。簡單來說,迭代順序是字串鍵的插入順序和類似數字的鍵的升序的組合:

// 键的顺序:1, foo, bar
const obj = { "foo": "foo", "1": "1", "bar": "bar" }

使用陣列或Map物件可以更好地實現這一點。 MapObject有一些相似之處,而保證按插入順序迭代鍵,沒有例外:

要注意的是,在ES2015之前,物件中的屬性順序根本沒有保證。來自ECMAScript第三版(pdf)的物件定義:

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!