Javascript IE9中的迭代顺序不同

Javascript IE9中的迭代顺序不同,javascript,internet-explorer-9,Javascript,Internet Explorer 9,在IE9中,对象属性的数字键被排序,这导致IE9中的迭代顺序与IE8不同,IE8在插入时保留顺序 var obj = { "5": "John", "1": "Kumar", "3": "Rajesh", "2": "Yogesh" } for(var key in obj) alert(key) 结果 //IE9中的1,2,3,4 //IE8、IE7中的5,1,3,2 我是否可以通过IE9禁用此自动排序。如果没有,那么是否有可能让浏览器理解键应该被标识为字符串而不是数字(

在IE9中,对象属性的数字键被排序,这导致IE9中的迭代顺序与IE8不同,IE8在插入时保留顺序

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

for(var key in obj) alert(key) 
结果

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

//IE8、IE7中的5,1,3,2

我是否可以通过IE9禁用此自动排序。如果没有,那么是否有可能让浏览器理解键应该被标识为字符串而不是数字(但不添加任何空格、u或任何其他特殊字符)

请建议

下面是我面临这个问题的示例代码片段

    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排序的,在IE9中我需要与插入顺序相同的顺序。

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

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

for(var key in obj) alert(key) 
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);
var-arr=[
{排名:“5”,名字:“约翰”},
{排名:“1”,名字:“库马尔”},
{排名:“3”,名字:“Rajesh”},
{排名:“2”,名字:“约格什”}
];
对于(var i=0;i

最后一点注意:使用
for································································浏览器似乎保持着你不能依赖的秩序。如果顺序很重要,请使用数组-或将键复制到数组中,根据需要进行排序,并在数组上迭代以获取键。
var personsArray=[p1,p2,p3,p4];对于要添加的(var i=0;i
,可以有一个数组,按键的显示顺序列出键。@Kolink:同意。我添加了一个示例。这里可能值得一提的是,即使在数组中,
for..in也不能保证以任何特定的顺序出现(至少,我从未在规范中发现任何这样的情况,IE8和更早版本也不按顺序出现)。有些实现将数组索引按顺序排列,即使它们没有使用等效对象(例如,Firefox在我的链接测试用例中输出5、1、3、2,然后是1、2、3、5),但不是全部。甚至不必是稀疏数组。如果需要订购,请使用
for
循环或一个新的ES5 funcs.@T.J.Crowder:是的,规范也明确说明了稀疏数组的情况,因为它包含在常规对象的情况下。JS中数组和对象之间唯一的真正区别是magic
length
属性(加上原型的所有额外方法)。我在回答中添加了一条关于
中…的注释。感谢您的回答。还有一个问题。我使用上面提到的obj在javascript中生成一个下拉列表(即var option=new option(obj.value,obj.key)。下拉列表应该按照值(John,Kumar,Rajesh,Yogesh)排序。尽管我已经根据值对其进行了排序,但在IE9中,它的排序基于键(1,2,3,4)如果我使用数组来存储这个列表,它会禁用这个排序吗?