JavaScript 中是否保證物件屬性的順序?
P粉663883862
P粉663883862 2023-10-12 20:05:36
0
2
445

如果我創建一個像這樣的物件:

var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";

產生的物件總是看起來像這樣嗎?

{ prop1 : "Foo", prop2 : "Bar" }

也就是說,屬性的順序是否與我添加它們的順序相同?

P粉663883862
P粉663883862

全部回覆(2)
P粉006977956

是(但不總是插入順序)。

大多數瀏覽器將物件屬性迭代為:

  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粉541565322

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

// key order: 1, foo, bar
const obj = { "foo": "foo", "1": "1", "bar": "bar" }

使用陣列或Map object 可能是實現此目的的更好方法。 MapObject保證按插入順序迭代鍵,沒有例外:

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

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