2016-03-08 53 views
3

使用for .. in循环遍历对象的成员时,枚举顺序为is implementation defined。但是,假设对象没有被修改,在相同的页面访问期间,在相同的浏览器中迭代两次,保证给出相同的顺序?javascript是否保证枚举相同的对象两次将按照相同的顺序遍历字段?

这是测试我正在谈论的属性的示例代码。现在的问题归结为一个浏览器是否可能抛出“不一样”:

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"; 

我很感兴趣,双方按照规范,在现有的浏览器做法的答案。

要清楚,我不是要求whether the order is consistent across browsers。我询问在一次访问网页和未修改对象的情况下,订单是否在多个枚举的同一对象中保持一致。

+1

当你创建一个测试用例在不同的浏览器中试用时会发生什么? –

+4

很确定这是不确定的行为:你真的不应该依赖它来保证正确性。 –

+0

@GeorgeStocker在Chrome和Firefox中,在我测试的小物件上,订单是一致的。但是因为我不能想到当对象没有被触及时改变顺序的幕后原因,这对我来说并不奇怪。可能会有一些有趣的情况发生变化(例如,导致JIT切换到不同的哈希策略的许多读取),但是我没有触发任何。 –

回答

2

不是。正如文档所述,它是依赖于实现的。这是不太可能如果它没有被修改,一个实现将以不同的顺序返回相同的对象,但没有保证。另一方面,

A Set object将“按照插入顺序迭代其元素”。

+0

一组记录插入顺序的集合吗?我想我们把这个名单叫做一个名单。嗯... – Alex

+0

@Alex会员资格测试仍然便宜,并且不支持快速访问索引;所以这是一个很好的设置。从一开始就有一个一致的迭代顺序是一个很好的设计理念,因为即使你有文档说他们不应该这样做,人们仍然有依赖实现怪癖的这种令人讨厌的倾向。 –

相关问题