【发布时间】:2013-03-07 21:49:07
【问题描述】:
如果我有一个对象,通过它的属性循环:
var obj = {a: 1, b: 2, c: 3}
for (var prop in obj){
console.log(obj[prop])
}
我是否会不可避免地得到:1、2、3 的结果?它可能取决于什么?其他结果实际上是真实的吗?
【问题讨论】:
标签: javascript
如果我有一个对象,通过它的属性循环:
var obj = {a: 1, b: 2, c: 3}
for (var prop in obj){
console.log(obj[prop])
}
我是否会不可避免地得到:1、2、3 的结果?它可能取决于什么?其他结果实际上是真实的吗?
【问题讨论】:
标签: javascript
不,语言中不保证对象属性的迭代顺序。
来自the MDN:
for...in 循环遍历一个对象的属性 任意顺序(有关为什么不能 取决于迭代的表面顺序,至少在一个 跨浏览器设置)
和
虽然 ECMAScript 使对象的迭代顺序 依赖于实现,似乎所有主流浏览器 支持基于最早添加的属性的迭代顺序 首先(至少对于不在原型上的属性)。然而,在 以 Internet Explorer 为例,当对属性使用 delete 时,一些 混淆行为结果,阻止其他浏览器使用 像对象文字这样的简单对象作为有序关联数组。在 资源管理器,而属性值确实设置为未定义,如果为 稍后添加一个具有相同名称的属性,该属性将是 在它的旧位置迭代——而不是在迭代序列的末尾 正如人们在删除属性然后添加后所期望的那样 它回来了。
所以如果你想模拟一个有序的关联数组 跨浏览器环境,你不得不使用两个独立的 数组(一个用于键,另一个用于值),或构建一个 单一属性对象的数组等。
如果你想要一个保证,你必须使用一个数组。如果您愿意,可以通过对属性键进行排序来构造它。
【讨论】: