循环对象的顺序只能在迭代期间中断
The order of looping through an object may be broken only during iteration?
我想循环对象的首选方法是这样的:
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认为重要的是初始创建时间,而其他人则使用最后创建时间。
相关文章:
- 如何在javascript中迭代数字列表
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 如何迭代Array.prototype函数
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 在ejs-partial中对JSON对象进行迭代
- 如何在DataTables 2.1中迭代对象数组
- 使用递归属性迭代保留属性结构
- 正在停止.在jquery中的特定时间间隔内,每次迭代的每次执行
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 主干-从模板中迭代的集合中获取特定的模型
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 什么's是在javascript中迭代项的最佳方式
- 为什么这只是迭代 HTMLCollection 的奇怪元素
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- Babel编译错误:找不到模块核心js/library/fn/get迭代器
- 如何在中断之前遍历此 for 循环中的所有城市?现在它只是迭代一个
- 循环对象的顺序只能在迭代期间中断
- 我的 JS 对象迭代在添加新属性时中断
- 每三次迭代后中断循环
- 为什么当我在迭代中中断标签时输出此结果