循环遍历对象的顺序可能只在迭代期间被破坏?

时间:2016-02-20 15:45:20

标签: javascript object iteration for-in-loop

我想循环一个对象的首选方法是:

for (var prop in obj) {
  if( obj.hasOwnProperty( prop ) ) {
    console.log("obj." + prop + " = " + obj[prop]);
  } 
}

MDN说

  

已删除,添加或修改的属性   for ... in循环以任意顺序迭代对象的属性(有关为什么人们不能依赖迭代的看似有序性的原因,请参阅删除运算符,至少在交叉 - 浏览器设置)。

因此,如果我在迭代期间不修改对象属性,我可以保证正确的顺序,即键/属性在对象中出现的顺序,或者此语句是否意味着其他内容?

1 个答案:

答案 0 :(得分:1)

MDN page on delete表示:

  

...所有主流浏览器都支持基于最早添加的属性的迭代顺序...但是,在Internet Explorer的情况下,当在属性上使用delete时[和]添加一个具有相同属性的属性name,属性将在其旧位置迭代 - 而不是在迭代序列的末尾...

插图:

var obj = {};

obj.x = 1; 
obj.y = 2;
obj.z = 3;

var a = [];
for(var i in obj) a.push(i);

delete obj.y;
obj.y = 2;

var b = [];
for(var i in obj) b.push(i);


document.write("1:" + a + "<br>2:" + b);

Chrome / FF / Safari显示1:x,y,z 2:x,z,y,而在MSIE(和Edge)中,结果为1:x,y,z 2:x,y,z

请注意,与ES5不同,ES6要求必须按创建顺序迭代属性:

  

对于每个自己的属性键P,O是一个String但不是整数索引,在属性创建顺序中......

     

http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys

标准不是很清楚“创造顺序”究竟是什么意思。 MS认为初始创建时间很重要,而其他人使用最后创建时间。