如果我创建这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象会 总是 这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,这些属性的顺序是否与我添加它们的顺序相同?
原文由 mellowsoon 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果我创建这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
生成的对象会 总是 这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
也就是说,这些属性的顺序是否与我添加它们的顺序相同?
原文由 mellowsoon 发布,翻译遵循 CC BY-SA 4.0 许可协议
是(但不总是插入顺序)。
大多数浏览器将对象属性迭代为:
一些较旧的浏览器结合了类别 #1 和 #2,按插入顺序迭代所有键。如果您的键可能解析为整数,最好不要依赖任何特定的迭代顺序。
保留 当前语言规范(自 ES2015 起) 的插入顺序,但解析为正整数(例如“7”或“99”)的键除外,其行为因浏览器而异。例如,当键被解析为数字时,Chrome/V8 不遵守插入顺序。
旧语言规范(ES2015 之前) :迭代顺序在技术上未定义,但所有主要浏览器都符合 ES2015 行为。
请注意,ES2015 行为是语言规范由现有行为驱动的一个很好的例子,而不是相反。要更深入地了解向后兼容的心态,请参阅 http://code.google.com/p/v8/issues/detail?id=164 ,这是一个 Chrome 错误,详细介绍了 Chrome 迭代顺序行为背后的设计决策.根据对该错误报告的一个(相当自以为是的)评论:
标准总是遵循实现,这就是 XHR 的来源,Google 通过实现 Gears 然后采用等效的 HTML5 功能来做同样的事情。正确的解决方法是让 ECMA 将事实上的标准行为正式合并到规范的下一个版本中。
原文由 Dave Dopson 发布,翻译遵循 CC BY-SA 4.0 许可协议
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
自 ES2015 以来,对象的迭代顺序遵循 一组特定的规则,但 它并不(总是)遵循插入顺序。简单地说,迭代顺序是字符串键的插入顺序和数字键的升序的组合:
使用数组或
Map
对象 可能是实现此目的的更好方法。Map
与Object
有一些相似之处,并 保证键按插入顺序迭代,无一例外:请注意,在 ES2015 之前,对象中的属性顺序根本无法保证。 ECMAScript 第三版中的对象定义(pdf) :