IE9中的迭代顺序不同

Kum*_*r V 2 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) 
Run Code Online (Sandbox Code Playgroud)

结果

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

// 5,1,3,2在IE8,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;
}
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*own 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);
Run Code Online (Sandbox Code Playgroud)

最后一点:使用时枚举顺序for...in循环,不保证任何类型的对象,包括数组的,所以你应该总是使用forwhile顺序事项时.