Javascript:“for”循环通过对象道具的顺序

时间:2013-03-19 09:35:18

标签: javascript

如果我有一个对象循环其属性:

var obj = {a: 1, b: 2, c: 3}

for (var prop in obj){
   console.log(obj[prop])
}

我不可避免地会得到:1,2,3因此?它可能取决于什么?其他结果实际上是否真实?

1 个答案:

答案 0 :(得分:3)

不,语言中无法保证对象属性中的迭代顺序。

来自the MDN

  

for ... in循环迭代一个对象的属性   任意顺序(有关为什么不能执行的更多信息,请参阅删除运算符   取决于迭代的看似有序性,至少在a   跨浏览器设置)

  

尽管ECMAScript生成了对象的迭代顺序   依赖于实现,它可能看起来是所有主流浏览器   支持基于最早添加的属性的迭代顺序   首先(至少对于不在原型上的属性)。但是,在   在Internet Explorer的情况下,当一个人在一个属性上使用delete时,有些人   混淆行为结果,阻止其他浏览器使用   像对象文字这样的简单对象作为有序关联数组。在   资源管理器,而属性值确实设置为undefined(如果有)   后来添加了一个具有相同名称的属性,属性将是   在旧的位置迭代 - 而不是在迭代序列的末尾   在删除该属性然后添加之后,人们可能会发现   它回来了。

     

因此,如果你想模拟一个有序的关联数组   跨浏览器环境,你被迫要么两个单独使用   数组(一个用于键,另一个用于值),或构建一个   单个属性对象的数组等。

如果您需要保证,则必须使用数组。如果愿意,可以通过对属性键进行排序来构造它。