循环对象的顺序只能在迭代期间中断

The order of looping through an object may be broken only during iteration?

本文关键字:迭代 中断 对象 顺序 循环      更新时间:2023-09-26

我想循环对象的首选方法是这样的:

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

MDN说

已删除、添加或修改的属性 一为...in 循环以任意顺序遍历对象的属性(有关为什么不能依赖迭代的看似有序性的更多信息,至少在跨浏览器设置中,请参阅 delete 运算符)。

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

MDN 页面在删除时指出:

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

插图:

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 是一个字符串,但不是整数索引,按属性创建顺序...

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

该标准不太清楚"创建顺序"的确切含义。MS认为重要的是初始创建时间,而其他人则使用最后创建时间。