现在对对象属性进行了排序吗

Are object properties ordered now?

本文关键字:排序 属性 对象      更新时间:2023-09-26

我注意到对象的ECMAScript定义已从第3版更改为第5版和第6版。

第3版

4.3.3 Object
An object is a member of the type Object. It is an unordered collection of
properties each of which contains a primitive value, object, or function. A
function stored in a property of an object is called a method.

第5版和第6版

4.3.3
object
member of the type Object.
NOTE An object is a collection of properties and has a single prototype
object. The prototype may be the null value. 

由于它不再表示属性的无序集合,这是否意味着它们现在是有序的?以及JavaScript?

至少在第六版中(强调矿):

9.1.12[[OwnPropertyKeys]]()

当调用O的[[OwnPropertyKeys]]内部方法时,将采取以下步骤:

  1. 让键成为一个新的空列表
  2. 对于作为整数索引的O的每个属性键p,按数字索引升序

    a。添加P作为键的最后一个元素。

  3. 对于O的每个自己的属性键p,它是字符串但不是整数索引,按属性创建顺序

    a。添加P作为键的最后一个元素。

  4. 对于作为符号的O的每个自己的属性密钥p,按属性创建顺序

    a。添加P作为键的最后一个元素。

  5. 归还钥匙。

规范依赖于属性的插入顺序,这意味着该顺序必须是对象的一部分。它还规定for in循环必须使用此顺序(请参阅7.3.21和19.1.2.14)。但是,浏览器并不是在所有情况下都完全尊重这一点,所以你不应该依赖它

ES6-Map类型还指定了迭代的插入顺序。我相信这种情况受到所有浏览器的尊重,所以如果你需要依赖这种行为,你应该更喜欢它。