IE9中的迭代顺序不同

时间:2012-03-30 11:33:07

标签: javascript internet-explorer-9

在IE9中,对象属性的数字键被排序,并且与IE8相比,IE9中的迭代顺序不同,IE8在插入时保留了顺序。

var obj = {
  "5": "John",
  "1": "Kumar",
  "3": "Rajesh",
  "2": "Yogesh"
}

for(var key in obj) alert(key) 

结果

// IE9中的1,2,3,4

IE8中的

// 5,1,3,2,IE7

无论如何我可以通过IE9禁用此自动排序。如果没有,则可以以某种方式使浏览器理解密钥应该被识别为字符串而不是数字(但不附加任何空格,_或任何其他特殊字符)

请建议!!

以下是我遇到此问题的示例代码段。

    function Person(id, name) {
    this.id = id;
    this.name = name;
}

var persons = new Object();

var p1 = Person("5","John")
persons[5]=p1
var p2 = Person("1","Kumar")
persons[1]=p2  
var p3 = Person("3","Rajesh")
persons[3]=p3
var p4 = Person("4","Yogesh")
persons[4]=p4


for(var id in personId){
   var p = persons[id];
   var option = new Option(p.name, p.id);
   select.options[select.options.length] = option;
}

此脚本生成的选择选项按IE9中的ID进行排序,其中我需要插入相同的顺序。

1 个答案:

答案 0 :(得分:9)

在ECMAScript中,包括版本5(编写时的当前版本)中的属性枚举顺序未定义,并且在浏览器之间有所不同,因此您不应该依赖任何特定的顺序。如果需要可预测的排序,请使用数组和forwhile循环。对于您的示例,一个选项是:

var arr = [
  {rank: "5", name: "John"},
  {rank: "1", name: "Kumar"},
  {rank: "3", name: "Rajesh"},
  {rank: "2", name: "Yogesh"}
];

for (var i = 0; i < arr.length; ++i) alert(arr[i].rank);

最后一点注意:对于任何类型的对象(包括数组),不保证使用for...in循环时的枚举顺序,因此在订购时应始终使用forwhile