javascript 是否保证枚举同一对象两次将以相同的顺序遍历字段

Does javascript guarantee that enumerating the same object twice will go over the fields in the same order?

本文关键字:两次 字段 遍历 顺序 是否 枚举 javascript 对象      更新时间:2023-09-26

当使用 for .. in 循环迭代对象的成员时,枚举顺序是实现定义的。但是,假设对象没有被修改,在同一个页面访问期间在同一浏览器中迭代它两次是否保证给出相同的顺序?

下面是测试我正在谈论的属性的示例代码。问题归结为浏览器是否可以抛出"不一样":

a = []
b = []
for (var e in obj)
    a.push(e);
for (var e in obj)
    b.push(e);
// Are a and b's contents now the same?
// Or is the same-ness implementation defined?
for (var i = 0; i < a.length; i++)
  if (a[i] !== b[i])
    throw "not the same";

我对根据规范和现有浏览器的实践的答案感兴趣。

需要明确的是,我不是在问顺序在浏览器之间是否一致。我问的是,在一次访问网页的上下文中,以及当对象未被修改时,顺序是否在同一对象的多个枚举中保持一致。

No.正如文档所述,它依赖于实现。如果不修改,实现不太可能以不同的顺序返回相同的对象,但无法保证。

另一方面,Set 对象将"按插入顺序迭代其元素"。