JavaScript保证对象属性顺序?

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

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

产生的对象是否总是像这样?

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

也就是说,这些属性的排列顺序是否与我添加的顺序相同?


不,在JavaScript中不保证对象中的属性顺序; 你需要使用一个Array

ECMAScript第三版中对象的定义(pdf):

4.3.3对象

一个对象是Object类型的成员。 它是一个无序的属性集合,每个属性都包含一个原始值,对象或函数。 存储在对象属性中的函数称为方法。

由于ECMAScript 2015 ,使用Map对象可能是另一种选择。 一个Map与一个Object有一些相似之处,并保证按键的顺序:

一个Map按照插入顺序迭代它的元素,而没有为Objects指定迭代顺序。


当前语言规范 :从技术上讲,订单未指定。

当前浏览器 :除了像“7”这样的按键解析为整数并由Chrome / V8以不同方式处理的按键之外,顺序被保留。

未来语言规范(> ES2015) :通常,您可以预期今天订购的东西不会变得无序。 新的API将保证订单; 现有的API很难改变。 有关更多详细信息,请参阅JMM的答案。

下面最好的链接是Tim Down的评论:

http://code.google.com/p/v8/issues/detail?id=164

该漏洞详细介绍了Chrome实现密钥排序所涉及的设计决策。 一个外卖是对于不解析为整数(即​​“a”或“b”,但不是“3”)的字符串键,键在所有主要浏览器上以插入顺序打印,并且这种行为不是“标准化”,它被浏览器厂商认为是一个重要的向后兼容性问题。 使用风险自负。

每一个(颇有观点的)评论:

标准总是遵循实现,这就是XHR来自哪里,Google通过实现Gears来实现同样的功能,然后采用相同的HTML5功能。 正确的做法是让ECMA将事实上的标准行为正式纳入规范的下一版本。

如果您依赖插入顺序,那么您不在ECMAScript规范中,只要您的键不以整数形式解析,就可以在常见浏览器行为的实际标准范围内使用。


在撰写本文时,大多数浏览器确实按照插入的顺序返回属性,但显然不能保证行为,因此不应该依赖它。

ECMAScript规范用于说:

没有指定枚举属性的机制和顺序。

但是,在ES2015和更高版本中,非整数键将以插入顺序返回。

链接地址: http://www.djcxy.com/p/95303.html

上一篇: Does JavaScript Guarantee Object Property Order?

下一篇: Is this a good pattern?