Javascript 是否保证对象属性的顺序?

创建了这样一个对象:

var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";

结果对象总是像这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
就是说,这些属性是否与我添加它们的顺序相同?

不同,在 JavaScript 中不能保证对象的属性顺序; 要用Array 。
对象的定义如下ECMAScript Third Edition (pdf) :
4.3.3 对象
对象是 Object 类型的成员。 它是属性的无序集合,每个属性包含一个基本值、对象或函数。 存储在对象的属性中的函数称为方法。
自 ECMAScript 2015版本以来,使用 Map 对象可能是选择。 一个 Map 和一个 Object 有一些相似之处,并且保证key的顺序:
Map 按插入顺序迭代其元素,而对象没有指定迭代顺序。

遍历得顺序在各个浏览器无法保证一致。
谷歌的是 遍历对象属性时会先提取所有 key 的 parseFloat 值为非负整数的属性,然后根据数字顺序对属性排序首先遍历出来,然后按照对象定义的顺序遍历余下的所有属性。
所以如果想要保证顺序,就放在数组里面遍历。

(对于非整数键)是的-上面的那个人答案是错的!
当前语言规范(自 ES2015以来)的插入顺序保持不变,除非键解析为整数(例如“7”或“99”) ,其行为在不同浏览器之间有所不同。 例如,当按键被解析为数字时,chrome / v8不用插入顺序。
旧的语言规范(在 ES2015之前) : 迭代顺序在技术上没有定义,但所有主要的浏览器都遵循 ES2015的规定。
注意,ES2015规范是一个很好的例子,说明语言规范是由现有行为驱动的。
标准总是跟随着执行变化,这就是 XHR 的起源,谷歌通过实现 Gears,然后采用相应的 HTML5功能来做同样的事情。 正确的解决办法是让 ECMA 正式地将事实上的标准行为合并到规范的下一个版本中。

普通对象的属性顺序在 Javascript 中是一个复杂的主题。
虽然在 ES5中没有明确指定顺序,但在某些情况下,ES2015有顺序。 给定的是以下对象:

o = Object.create(null, {
  m: {value: function() {}, enumerable: true},
  "2": {value: "2", enumerable: true},
  "b": {value: "b", enumerable: true},
  0: {value: 0, enumerable: true},
  [Symbol()]: {value: "sym", enumerable: true},
  "1": {value: "1", enumerable: true},
  "a": {value: "a", enumerable: true},});

这导致以下顺序(在某些情况下) :

Object {
  0: 0,
  1: "1",
  2: "2",
  b: "b",
  a: "a",
  m: function() {},
  Symbol(): "sym"}
  1. 类似整数的按升序排列的键
  2. 按插入顺序排列的普通键
  3. 插入顺序符号

因此,有三个段,它们可能改变插入顺序(如示例中所示)。 而且类似整数的键根本不遵循插入顺序。
问题是,在 ES2015规范中,对于什么方法可以保证这个顺序?
下列方法保证了所显示的顺序:

• Object.assign

• Object.defineProperties

• Object.getOwnPropertyNames

• Object.getOwnPropertySymbols

• Reflect.ownKeys

下面的方法 / 循环保证没有任何顺序:

• Object.keys

• for..in

• JSON.parse

• JSON.stringify

结论: 即使在 ES2015中,你也不应该依赖于 Javascript 中普通对象的属性顺序。 它很容易出错。用Map 代替。