【问题标题】:IE9 javascript sort order ... why?IE9 javascript排序顺序...为什么?
【发布时间】:2023-03-26 10:35:01
【问题描述】:

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

为什么?这正常吗?

【问题讨论】:

  • 您使用的是哪个版本的 IE9?可能是较新的测试版已经改变了这种行为。
  • 0的情况下,只需将其按值排序为primary,并按id排序即可。
  • 您确定是sort 而不是for-infor-in 不保证任何特定的顺序,因此不应将其用于数组。
  • @Tom Tu:不正确。在javascript中,数组是一种对象。因此,使用for-in 时的顺序规则对于数组和普通对象是相同的。也就是说,没有规则。它完全依赖于实现。
  • ...来自 ECMAScript 5,第 12.6.4 节,for-in 语句 “枚举属性的机制和顺序(步骤 6.a 在第一个算法,第二个中的步骤 7.a)没有指定。”

标签: javascript sorting internet-explorer-9


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    来自MDC(强调我的):

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

    根据我的经验,只有 Chrome/Firefox 能做到这一点。 Opera 11 的行为对我来说......没有很好的定义。

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

    [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]

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        • 1970-01-01
        • 2017-07-23
        • 2011-01-21
        • 1970-01-01
        相关资源
        最近更新 更多