繁体   English   中英

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

[英]IE9 javascript sort order … why?

我注意到当比较函数返回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

为什么? 那是正常的吗?

如果要遍历数字属性,请不要for...in数组上使用for...in ,这有两个原因:

  • 您还将获得添加到Array.prototype方法和属性。
  • 在ECMAScript规范中,迭代顺序被定义为与实现有关,这在理论上可以是任意的。

这两点也适用于Object Chrome实际上不符合最常见的浏览器行为,导致Chrome Bug报告中引起了激烈的争论

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] <-不维护非零的顺序

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM