JavaScript 中是否保证对象属性的顺序?
P粉663883862
P粉663883862 2023-10-12 20:05:36
0
2
480

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

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)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板