如果我创建一个这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象总是这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性是否与我添加它们的顺序相同?
如果我创建一个这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象总是这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性是否与我添加它们的顺序相同?
当前回答
Object和MAP with Example的主要区别:
它是循环中的迭代顺序,在Map中它遵循创建时设置的顺序,而在OBJECT中没有。
看到的: 对象
const obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
obj['1'] = "day";
console.log(obj)
**OUTPUT: {1: "day", prop1: "Foo", prop2: "Bar"}**
MAP
const myMap = new Map()
// setting the values
myMap.set("foo", "value associated with 'a string'")
myMap.set("Bar", 'value associated with keyObj')
myMap.set("1", 'value associated with keyFunc')
OUTPUT:
**1. ▶0: Array[2]
1. 0: "foo"
2. 1: "value associated with 'a string'"
2. ▶1: Array[2]
1. 0: "Bar"
2. 1: "value associated with keyObj"
3. ▶2: Array[2]
1. 0: "1"
2. 1: "value associated with keyFunc"**
其他回答
在撰写本文时,大多数浏览器确实以插入属性的相同顺序返回属性,但这显然不能保证行为,因此不应该依赖。
ECMAScript规范曾经说:
列举属性的机制和顺序……未指定。
但是在ES2015及以后版本中,非整数键将按插入顺序返回。
在现代浏览器中,您可以使用Map数据结构而不是对象。
开发人员mozilla >地图
Map对象可以按插入顺序迭代其元素…
Object和MAP with Example的主要区别:
它是循环中的迭代顺序,在Map中它遵循创建时设置的顺序,而在OBJECT中没有。
看到的: 对象
const obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
obj['1'] = "day";
console.log(obj)
**OUTPUT: {1: "day", prop1: "Foo", prop2: "Bar"}**
MAP
const myMap = new Map()
// setting the values
myMap.set("foo", "value associated with 'a string'")
myMap.set("Bar", 'value associated with keyObj')
myMap.set("1", 'value associated with keyFunc')
OUTPUT:
**1. ▶0: Array[2]
1. 0: "foo"
2. 1: "value associated with 'a string'"
2. ▶1: Array[2]
1. 0: "Bar"
2. 1: "value associated with keyObj"
3. ▶2: Array[2]
1. 0: "1"
2. 1: "value associated with keyFunc"**
正如其他人所述,当迭代对象的属性时,您无法保证顺序。如果你需要多个字段的有序列表,我建议创建一个对象数组。
var myarr = [{somfield1: 'x', somefield2: 'y'},
{somfield1: 'a', somefield2: 'b'},
{somfield1: 'i', somefield2: 'j'}];
这样你就可以使用一个常规的for循环,并有插入顺序。然后,如果需要,可以使用Array sort方法将其排序到一个新数组中。
在ES2015中,确实如此,但不是你想的那样
对象中键的顺序直到ES2015才得到保证。它是由实现定义的。
但是,在ES2015中指定了in。像JavaScript中的许多东西一样,这样做是为了兼容性,并且通常反映了大多数JS引擎中现有的非官方标准(你知道谁是例外)。
该顺序在规范中定义,在抽象操作OrdinaryOwnPropertyKeys下,该操作支持遍历对象自身键的所有方法。转述一下,顺序如下:
所有整数索引键(像“1123”,“55”等)以升序数字排列。 所有不是整数索引的字符串键,按创建的顺序(最早的-先的)。 所有符号键,按创建的顺序(最早的-先的)。
说顺序不可靠是愚蠢的——它是可靠的,只是可能不是你想要的,现代浏览器正确地实现了这个顺序。
一些例外包括枚举继承键的方法,例如for ..在循环。for ..循环不能保证按照规范的顺序。