[英]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
方法和属性。 这两点也适用于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;});
根据您的排序功能,这两个元素都是相等的,它们出现的顺序无关紧要。由浏览器决定保持原来的顺序还是切换它认为合适的顺序...都不是一种保证。
如果两者不相等,则排序功能不正确,还应考虑其他项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.