IE9 javascript排序顺序......为什么?

时间:2011-01-24 14:06:39

标签: javascript sorting internet-explorer-9

我注意到当比较函数返回0时,IE9排序顺序正在改变元素顺序。

请参阅:

var myarray=[
    {id:1,val:0},
    {id:2,val:0},
    {id:3,val:7},
    {id:4,val:41}
];
myarray.sort(function(a,b){return a.val - b.val});

for(var i in myarray)
{
    console.log(myarray[i].id);
}

Chrome,Firefox,Opera和Safari的当前稳定版本获得了以下输出:1 2 3 4

IE7和IE8的输出相同。

IE9输出为:2 1 3 4

为什么呢?这是正常的吗?

3 个答案:

答案 0 :(得分:4)

如果您尝试迭代数字属性,请不要在数组上使用for...in,原因有两个:

  • 您还将获得添加到Array.prototype的方法和属性;
  • 迭代顺序在ECMAScript规范中定义为依赖于实现,这意味着理论上它可以是任何东西。

这两点也适用于Object。事实上,Chrome不符合最常见的浏览器行为,导致heated debate in a Chrome bug report

答案 1 :(得分:3)

来自MDC(强调我的):

  

如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。 [注意:ECMAscript标准不保证这种行为] ,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。

根据我的经验,只有Chrome / Firefox才能做到这一点。 Opera 11对我的行为是......没有明确定义。

例如,使用sort将所有零移动到数组的顶部:

[1, 0, 3, 0, 5, 0, 2].sort(function (a, b) { return b === 0 && 1 || 0;});
  • 铬10:[0,0,0,1,3,5,2]
  • Firefox 4:[0,0,0,1,3,5,2]
  • Opera 11:[0,0,0,2,1,5,3]< - 不保持非零的顺序

答案 2 :(得分:2)

根据您的排序功能,这两个元素都是相同的,它们出现在哪个顺序无关紧要。浏览器可以按原样保留订单,也可以根据需要切换订单。 ..两者都不是保证。

如果两者不相等,那么您的排序功能不正确,并且还应考虑其他项目。