首页  >  问答  >  正文

JavaScript 中是否保证对象属性的顺序?

如果我创建一个像这样的对象:

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

生成的对象总是看起来像这样吗?

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

也就是说,属性的顺序是否与我添加它们的顺序相同?

P粉663883862P粉663883862373 天前455

全部回复(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
  • 取消回复