我想循环一个对象的首选方法是:
for (var prop in obj) {
if( obj.hasOwnProperty( prop ) ) {
console.log("obj." + prop + " = " + obj[prop]);
}
}
MDN说
已删除,添加或修改的属性 for ... in循环以任意顺序迭代对象的属性(有关为什么人们不能依赖迭代的看似有序性的原因,请参阅删除运算符,至少在交叉 - 浏览器设置)。
因此,如果我在迭代期间不修改对象属性,我可以保证正确的顺序,即键/属性在对象中出现的顺序,或者此语句是否意味着其他内容?
答案 0 :(得分:1)
...所有主流浏览器都支持基于最早添加的属性的迭代顺序...但是,在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但不是整数索引,在属性创建顺序中......
标准不是很清楚“创造顺序”究竟是什么意思。 MS认为初始创建时间很重要,而其他人使用最后创建时间。