【问题标题】:Is the order of fields in a javascript object predictable when looping through them?循环遍历它们时,javascript对象中的字段顺序是否可预测?
【发布时间】:2024-01-23 04:08:01
【问题描述】:

在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
}

这是重复的:Elements order - for (… in …) loop in javascript

【问题讨论】:

标签: javascript language-features


【解决方案1】:

大多数浏览器会按照属性添加到对象的顺序循环访问这些属性,但 Javascript 标准规定该顺序是未定义的——因此您不应依赖这种行为。例如,不久前我读到了一封 blog post,其中提到了 Google Chrome 并非总是表现出这种行为。

如果您需要有序的功能,您应该为自己创建一个可以使用对象键或数字键的新类。

【讨论】:

  • 非常感谢您的链接。 John 所说的是,虽然它不是标准的,但浏览器供应商会像使用它一样应用它(因此 Chrome 团队将修复“错误”)。
  • 是的。尽管我仍然认为您不应该依赖这种行为。更安全地创建一个自定义类,您可以在其中自己定义行为。
【解决方案2】:

不,行为取决于实现,并且不能保证。需要保留订单时使用数组。

【讨论】:

  • 是但(在标准中):“枚举属性的机制(第一个算法中的步骤 5,第二个算法中的步骤 6)取决于实现。枚举的顺序由对象定义。”所以枚举本身是依赖于实现的,但是顺序是依赖于对象的,不是吗?
  • @Julian:ECMA-262 的下一版 3.1 不那么含糊:“没有指定枚举属性的机制和顺序 [...]。”
最近更新 更多