如果我创建一个这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象总是这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性是否与我添加它们的顺序相同?
如果我创建一个这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象总是这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性是否与我添加它们的顺序相同?
当前回答
这是我吃了不少苦头才知道的。
使用React和Redux,我想遍历的键的状态容器,以生成子,每次存储被更改时都会刷新(根据Redux的不变性概念)。
因此,为了获取Object.keys(valueFromStore),我使用了Object.keys(valueFromStore).sort(),这样我至少现在有了键的字母顺序。
其他回答
在撰写本文时,大多数浏览器确实以插入属性的相同顺序返回属性,但这显然不能保证行为,因此不应该依赖。
ECMAScript规范曾经说:
列举属性的机制和顺序……未指定。
但是在ES2015及以后版本中,非整数键将按插入顺序返回。
正如其他人所述,当迭代对象的属性时,您无法保证顺序。如果你需要多个字段的有序列表,我建议创建一个对象数组。
var myarr = [{somfield1: 'x', somefield2: 'y'},
{somfield1: 'a', somefield2: 'b'},
{somfield1: 'i', somefield2: 'j'}];
这样你就可以使用一个常规的for循环,并有插入顺序。然后,如果需要,可以使用Array sort方法将其排序到一个新数组中。
对于一个100%故障安全的解决方案,你可以使用嵌套对象,并像这样做:
const obj = {};
obj.prop1 = {content: "Foo", index: 0};
obj.prop2 = {content: "Bar", index: 1};
for (let i = 0; i < Object.keys(obj).length; i++)
for (const prop in obj) {
if (obj[prop].index == i) {
console.log(obj[prop].content);
break;
}
}
自ES2015以来,对象的迭代顺序遵循一定的规则集,但它并不(总是)遵循插入顺序。简单地说,迭代顺序是字符串键的插入顺序和数字键的升序的组合:
// key order: 1, foo, bar
const obj = { "foo": "foo", "1": "1", "bar": "bar" }
使用数组或Map对象可能是实现这一点的更好方法。Map与Object有一些相似之处,并保证键按照插入的顺序迭代,无一例外:
Map中的键是有序的,而添加到对象中的键不是有序的。因此,当对其进行迭代时,Map对象将按插入顺序返回键。(请注意,在ECMAScript 2015规范中,对象确实保留了字符串和符号键的创建顺序,因此只使用ie字符串键遍历对象会产生插入顺序的键)
值得注意的是,在ES2015之前,对象中的属性顺序根本没有得到保证。ECMAScript第三版对象定义(pdf):
4.3.3对象 对象的成员 类型的对象。它是每个属性的无序集合 包含原语值、对象或 函数。函数中存储的函数 对象的属性称为 方法。
来自JSON标准:
对象是零个或多个名称/值对的无序集合,其中名称为字符串,值为字符串、数字、布尔值、空值、对象或数组。
(强调我的)。
所以,不,你不能保证订单。