现在是否订购了对象属性?

时间:2015-12-08 19:58:33

标签: javascript ecmascript-6 ecmascript-5

我注意到对象的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?

1 个答案:

答案 0 :(得分:3)

排序,至少在第六版(强调我的):

  

9.1.12 [[OwnPropertyKeys]]()

     

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

     
      
  1. 让密钥成为新的空列表。
  2.   
  3. 对于每个自己的属性键P,O是一个整数索引,按升序数字索引顺序

         

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

  4.   
  5. 对于作为字符串但不是整数索引的O的每个属性键P,属性创建顺序中的

         

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

  6.   
  7. 对于作为符号的O的每个自有属性键P,属性创建顺序中的

         

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

  8.   
  9. 返回键。

  10.   

规范依赖于属性的插入顺序,暗示订单必须是对象的一部分。它还指定for in循环必须使用此顺序(参见7.3.21和19.1.2.14)。但是,browsers do not entirely respect this in all cases,所以你不应该依赖它。

The ES6 Map type还指定迭代的插入顺序。我相信所有浏览器都尊重 这个案例,所以如果你需要依赖这种行为,你应该更喜欢它。