如果我像这样创建一个对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象always会像这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性的顺序是否与我添加它们的顺序相同?
如果我像这样创建一个对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象always会像这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性的顺序是否与我添加它们的顺序相同?
自ES2015以来,对象的迭代顺序遵循a certain set of rules,但不是it does not (always) follow the insertion order.简单地说,迭代顺序是字符串键的插入顺序和类数字键的升序的组合:
// key order: 1, foo, bar
const obj = { "foo": "foo", "1": "1", "bar": "bar" }
使用数组或Map
object可以更好地实现这一点.Map
与Object
和guarantees the keys to be iterated in order of insertion有一些相似之处,无一例外:
贴图中的键是有序的,而添加到对象中的键不是有序的.因此,当对其进行迭代时,Map对象会按插入顺序返回键.(请注意,在ECMAScript 2015规范中,对象确实保留了字符串键和符号键的创建顺序,因此仅使用ie字符串键遍历对象将按插入顺序生成键)
值得一提的是,在ES2015之前,对象中的属性顺序根本不能得到保证.从ECMAScript Third Edition (pdf)开始的对象定义:
4.3.3目标
对象是