使用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。我询问在一次访问网页和未修改对象的情况下,订单是否在多个枚举的同一对象中保持一致。
当你创建一个测试用例在不同的浏览器中试用时会发生什么? –
很确定这是不确定的行为:你真的不应该依赖它来保证正确性。 –
@GeorgeStocker在Chrome和Firefox中,在我测试的小物件上,订单是一致的。但是因为我不能想到当对象没有被触及时改变顺序的幕后原因,这对我来说并不奇怪。可能会有一些有趣的情况发生变化(例如,导致JIT切换到不同的哈希策略的许多读取),但是我没有触发任何。 –