1

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

看:

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

为什么?这正常吗?

4

3 回答 3

4

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

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

这两点也适用于Objects。Chrome 实际上并不符合最常见的浏览器行为,导致Chrome 错误报告中的激烈争论

于 2011-01-24T14:22:49.130 回答
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]
  • 火狐 4: [0, 0, 0, 1, 3, 5, 2]
  • Opera 11: [0, 0, 0, 2, 1, 5, 3] <- 不保持非零的顺序
于 2011-01-24T14:10:36.373 回答
2

根据您的排序功能,这两个元素是相等的,它们出现的顺序无关紧要。浏览器可以保持原样或切换它认为合适的顺序......两者都不是一种保证。

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

于 2011-01-24T14:11:27.477 回答