如果我创建一个这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象总是这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性是否与我添加它们的顺序相同?
如果我创建一个这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象总是这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性是否与我添加它们的顺序相同?
当前回答
是(但不总是插入顺序)。
大多数浏览器迭代对象属性为:
以升序排列的正整数键(以及像“1”这样解析为整型的字符串) 字符串键,按插入顺序(ES2015保证这一点,所有浏览器都遵守) 符号名称,按插入顺序(ES2015保证这一点,所有浏览器都遵守)
一些较老的浏览器结合了类别#1和#2,按插入顺序迭代所有键。如果您的键可能被解析为整数,最好不要依赖于任何特定的迭代顺序。
当前语言规范(自ES2015起)的插入顺序保持不变,除非键解析为正整数(如“7”或“99”),在不同浏览器中行为不同。例如,当键被解析为数字时,Chrome/V8不尊重插入顺序。
旧的语言规范(在ES2015之前):迭代顺序在技术上没有定义,但所有主流浏览器都遵守ES2015行为。
请注意,ES2015行为是语言规范由现有行为驱动的一个很好的例子,而不是相反。要更深入地了解向后兼容的心态,请参阅http://code.google.com/p/v8/issues/detail?id=164,这是一个Chrome bug,详细介绍了Chrome迭代顺序行为背后的设计决策。 根据对该错误报告的(相当固执己见的)评论:
标准总是跟着实现走的,XHR就是这么来的,谷歌通过实现Gears,然后拥抱等价的HTML5功能来做同样的事情。正确的解决方法是让ECMA正式地将事实上的标准行为纳入规范的下一个版本中。
其他回答
来自JSON标准:
对象是零个或多个名称/值对的无序集合,其中名称为字符串,值为字符串、数字、布尔值、空值、对象或数组。
(强调我的)。
所以,不,你不能保证订单。
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及以后版本中,非整数键将按插入顺序返回。
是(但不总是插入顺序)。
大多数浏览器迭代对象属性为:
以升序排列的正整数键(以及像“1”这样解析为整型的字符串) 字符串键,按插入顺序(ES2015保证这一点,所有浏览器都遵守) 符号名称,按插入顺序(ES2015保证这一点,所有浏览器都遵守)
一些较老的浏览器结合了类别#1和#2,按插入顺序迭代所有键。如果您的键可能被解析为整数,最好不要依赖于任何特定的迭代顺序。
当前语言规范(自ES2015起)的插入顺序保持不变,除非键解析为正整数(如“7”或“99”),在不同浏览器中行为不同。例如,当键被解析为数字时,Chrome/V8不尊重插入顺序。
旧的语言规范(在ES2015之前):迭代顺序在技术上没有定义,但所有主流浏览器都遵守ES2015行为。
请注意,ES2015行为是语言规范由现有行为驱动的一个很好的例子,而不是相反。要更深入地了解向后兼容的心态,请参阅http://code.google.com/p/v8/issues/detail?id=164,这是一个Chrome bug,详细介绍了Chrome迭代顺序行为背后的设计决策。 根据对该错误报告的(相当固执己见的)评论:
标准总是跟着实现走的,XHR就是这么来的,谷歌通过实现Gears,然后拥抱等价的HTML5功能来做同样的事情。正确的解决方法是让ECMA正式地将事实上的标准行为纳入规范的下一个版本中。
这是我吃了不少苦头才知道的。
使用React和Redux,我想遍历的键的状态容器,以生成子,每次存储被更改时都会刷新(根据Redux的不变性概念)。
因此,为了获取Object.keys(valueFromStore),我使用了Object.keys(valueFromStore).sort(),这样我至少现在有了键的字母顺序。