如果我创建一个像这样的对象:
var obj = {}; obj.prop1 = "Foo"; obj.prop2 = "Bar";
生成的对象总是看起来像这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,属性的顺序是否与我添加它们的顺序相同?
是(但并不总是插入顺序)。
大多数浏览器将对象属性迭代为:
一些较旧的浏览器将类别 #1 和 #2 结合起来,按插入顺序迭代所有键。如果您的键可能解析为整数,那么最好不要依赖任何特定的迭代顺序。
当前语言规范(自 ES2015 起) 插入顺序将被保留,但解析为正整数(例如“7”或“99”)的键除外,这种情况下浏览器的行为会有所不同。例如,当键解析为数字时,Chrome/V8 不考虑插入顺序。
旧语言规范(ES2015 之前):迭代顺序在技术上未定义,但所有主要浏览器都遵守 ES2015 行为。
请注意,ES2015 行为是语言规范由现有行为驱动的一个很好的例子,而不是相反。要更深入地了解向后兼容的心态,请参阅 http:// code.google.com/p/v8/issues/detail?id=164,一个 Chrome 错误,详细介绍了 Chrome 迭代顺序行为背后的设计决策。 根据该错误报告的(相当固执己见的)评论之一:
自 ES2015 以来,对象的迭代顺序遵循一组特定规则,但它并不(总是) ) 遵循插入顺序。简单地说,迭代顺序是字符串键的插入顺序和类似数字的键的升序的组合:
// key order: 1, foo, bar const obj = { "foo": "foo", "1": "1", "bar": "bar" }
使用数组或Map object 可能是实现此目的的更好方法。 Map 与 Object 和 保证按插入顺序迭代键,无一例外:
Map object
Map
Object
需要注意的是,在 ES2015 之前根本无法保证对象中的属性顺序。对象的定义来自 ECMAScript 第三版 (pdf):
是(但并不总是插入顺序)。
大多数浏览器将对象属性迭代为:
一些较旧的浏览器将类别 #1 和 #2 结合起来,按插入顺序迭代所有键。如果您的键可能解析为整数,那么最好不要依赖任何特定的迭代顺序。
当前语言规范(自 ES2015 起) 插入顺序将被保留,但解析为正整数(例如“7”或“99”)的键除外,这种情况下浏览器的行为会有所不同。例如,当键解析为数字时,Chrome/V8 不考虑插入顺序。
旧语言规范(ES2015 之前):迭代顺序在技术上未定义,但所有主要浏览器都遵守 ES2015 行为。
请注意,ES2015 行为是语言规范由现有行为驱动的一个很好的例子,而不是相反。要更深入地了解向后兼容的心态,请参阅 http:// code.google.com/p/v8/issues/detail?id=164,一个 Chrome 错误,详细介绍了 Chrome 迭代顺序行为背后的设计决策。 根据该错误报告的(相当固执己见的)评论之一:
自 ES2015 以来,对象的迭代顺序遵循一组特定规则,但它并不(总是) ) 遵循插入顺序。简单地说,迭代顺序是字符串键的插入顺序和类似数字的键的升序的组合:
使用数组或
Map object
可能是实现此目的的更好方法。Map
与Object
和 保证按插入顺序迭代键,无一例外:需要注意的是,在 ES2015 之前根本无法保证对象中的属性顺序。对象的定义来自 ECMAScript 第三版 (pdf):