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

javascript是否保证枚举同一对象两次将以相同的顺序遍历字段?,javascript,Javascript,当使用for..对对象的成员进行迭代时。。在循环中,枚举顺序。但是,假设对象没有被修改,在同一个页面访问期间在同一个浏览器中对其进行两次迭代是否保证给出相同的顺序 下面是测试我所说的属性的示例代码。问题归结为浏览器是否会抛出“不一样”: a=[] b=[] 用于(obj中的var e) a、 推(e); 用于(obj中的var e) b、 推(e); //a和b的内容现在是一样的吗? //还是定义了相同的实现? 对于(变量i=0;i

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

下面是测试我所说的属性的示例代码。问题归结为浏览器是否会抛出“不一样”:

a=[]
b=[]
用于(obj中的var e)
a、 推(e);
用于(obj中的var e)
b、 推(e);
//a和b的内容现在是一样的吗?
//还是定义了相同的实现?
对于(变量i=0;i
我对这个答案很感兴趣,无论是根据规范还是在现有浏览器上的实践


说清楚点,我不是在问。我问的是,同一对象的多个枚举之间的顺序是否一致,在一次访问网页的上下文中,以及对象未被修改的情况下。

否。正如文档所述,这取决于实现。如果一个实现没有被修改,它不太可能以不同的顺序返回同一个对象,但是不能保证


另一方面,A将“按插入顺序迭代其元素”

当你创建一个测试用例在不同的浏览器中进行测试时会发生什么?很肯定这是未定义的行为:你真的不应该依赖它来判断正确性。@GeorgeStocker在Chrome和Firefox中,在我测试的小对象上,顺序是一致的。但是,因为我想不出任何好的幕后原因,当物体没有被触摸时,改变顺序,这对我来说并不奇怪。可能会有一些有趣的情况发生变化(例如,许多读取导致JIT切换到不同的散列策略),但我没有触发任何变化。个人轶事——迭代performance timing对象以相同的顺序生成相同的属性,但特定于每个浏览器。当试图在chrome和firefox中迭代对象时,属性出现的顺序有细微的差异。跟踪插入顺序的数据集?我想我们称之为列表。好吧…@Alex成员资格测试仍然很便宜,而且不支持通过索引进行快速访问;所以这是一个很好的设置。从一开始就有一个一致的迭代顺序是一个好的设计想法,因为人们有一种依赖于实现怪癖的讨厌倾向,即使你有文档说他们不应该这样做。
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";