当循环遍历JavaScript对象时,字段的顺序是否可以预测?

16

在php中,如果你有以下代码:

$map = array(
  "first" => 1,
  "second" => 2
);

$map["third"] = 3;

foreach($map as $key => $value) {
  // code
}
您知道条目将按照它们添加到数组中的顺序列出。
现在,我能否假设相同的规则适用于下面的JavaScript等效代码吗?
map = {
  "first": 1,
  "second": 2
};

map["third"] = 3;

for (key in map) {
  // code
}
这是一个重复的问题:JavaScript中for (... in ...)循环的元素顺序

2个回答

10
大多数浏览器将按照属性添加到对象中的顺序循环遍历这些属性,但JavaScript标准规定其顺序未定义,因此您不应依赖此行为。例如,我曾经读过一篇关于Google Chrome并非总是表现出这种行为的博客文章
如果需要有序功能,则应为自己创建一个新类,该类可以使用对象或数字键。

1
非常感谢提供的链接。John 的意思是,尽管它不是标准,但浏览器厂商会像应用标准一样使用它(因此 Chrome 团队将修复这个“错误”)。 - Julian Aubourg
1
是的。虽然我仍然认为你不应该依赖这种行为。最好创建一个自定义类,在其中可以自己定义行为。 - chroder

0
不,行为取决于实现,并不能保证。当需要保留顺序时,请使用数组。

1
是的,但是(在标准中):“枚举属性的机制(第一算法中的步骤5,第二算法中的步骤6)取决于实现。枚举的顺序由对象定义。”因此,枚举本身是实现相关的,但顺序是由对象确定的,对吗? - Julian Aubourg
1
@Julian:ECMA-262的下一个版本3.1更少有歧义:“列举属性的机制和顺序[...]未指定。” - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接