我注意到对象的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?
答案 0 :(得分:3)
排序,至少在第六版(强调我的):
9.1.12 [[OwnPropertyKeys]]()
当调用O的[[OwnPropertyKeys]]内部方法时,采取以下步骤:
- 让密钥成为新的空列表。
对于每个自己的属性键P,O是一个整数索引,按升序数字索引顺序
一个。添加P作为键的最后一个元素。
对于作为字符串但不是整数索引的O的每个属性键P,属性创建顺序中的
一个。添加P作为键的最后一个元素。
对于作为符号的O的每个自有属性键P,属性创建顺序中的
一个。添加P作为键的最后一个元素。
- 醇>
返回键。
规范依赖于属性的插入顺序,暗示订单必须是对象的一部分。它还指定for in
循环必须使用此顺序(参见7.3.21和19.1.2.14)。但是,browsers do not entirely respect this in all cases,所以你不应该依赖它。
The ES6 Map type还指定迭代的插入顺序。我相信所有浏览器都尊重 这个案例,所以如果你需要依赖这种行为,你应该更喜欢它。