JavaScript保证对象属性的顺序吗?
P粉287254588
P粉287254588 2023-08-17 17:04:41
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粉287254588
P粉287254588

全部回复(2)
P粉186897465

是的(但不总是按插入顺序)。

大多数浏览器迭代对象属性的顺序如下:

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

自从ES2015以来,对象的迭代顺序遵循一定的规则,但是它并不总是遵循插入顺序。简而言之,迭代顺序是字符串键的插入顺序和类似数字键的升序的组合:

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

使用数组或Map对象可以更好地实现这一点。 MapObject有一些相似之处,并且保证按插入顺序迭代键,没有例外:

需要注意的是,在ES2015之前,对象中的属性顺序根本不被保证。来自ECMAScript第三版(pdf)的对象定义:

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!