首頁  >  問答  >  主體

JavaScript 中是否保證物件屬性的順序?

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

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

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

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

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

P粉663883862P粉663883862373 天前451

全部回覆(2)我來回復

  • P粉006977956

    P粉0069779562023-10-13 16:31:53

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

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

    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 迭代順序行為背後的設計決策。 根據該錯誤報告的(相當固執己見的)評論之一:

    回覆
    0
  • P粉541565322

    P粉5415653222023-10-13 14:55:26

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

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

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

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

    回覆
    0
  • 取消回覆