在IE 9中,如果我在控制台中输入:
[1, 4, 2, 3].sort(function (a, b) { return a < b; });
结果数组为:[1, 4, 2, 3]
。
如果我在FF / Chrome中执行此操作,我会得到它,反向排序:[4, 3, 2, 1]
。
为什么这在IE中不起作用?
编辑:是否有一个功能抽象出这些浏览器的差异?换句话说,是否有一个函数我可以传递函数(a,b){return a&lt; b;在所有浏览器中获得相同的结果?任何开源的东西?
答案 0 :(得分:8)
可能因为如果-1
较小,该函数应返回a
,如果相等则0
,如果1
较大,则a
如果你想要反向订购,反之亦然)。 编辑:实际上,它必须为零,正数或负数(正如@pimvdb指出的那样,这就是我在下面的例子中使用的)。您的函数永远不会返回-1
,这可能会产生问题。
考虑1
和3
。您的函数会为1
返回1 < 3
,这是正常的,但会为0
返回3 < 1
。在一种情况下,数字是不同的,在另一种情况下,你说它们是相同的。
FF / Chrome按相反顺序排序可能是由于他们正在使用的排序算法。
尝试:
[1, 4, 2, 3].sort(function (a, b) { return b - a; });
更新:为了证实这一点,我们可以查看规范,第15.4.4.11 Array.prototype.sort(comparefn部分),其中给出的属性必须由比较函数来实现:
函数 comparefn 是一组值
S
的一致比较函数,如果所有值满足以下所有要求 a ,S中的> b 和 c (可能是相同的值):符号 a &lt; CF b 表示 comparefn(a,b)&lt; 0; a = CF b 表示 comparefn(a,b) = 0(任一符号);和 a &gt; CF b 表示 comparefn(a,b)&gt; 0
- 当给出一对特定值 a 和 b 作为其两个值时,调用 comparefn(a,b)始终返回相同的值v参数。此外,类型( v )是数字, v 不是 NaN 。请注意,这意味着 a &lt; CF b 中的一个, a = CF b , a &gt; CF b <对于给定的一对 a 和 b ,/ em>将为true。
- 调用 comparefn(a,b)不会修改此对象。
- a = CF a (反身性)
- 如果 a = CF b ,那么 b = CF a (对称)
- 如果 a = CF b 和 b = CF c ,然后 a = CF c (传递性= CF )
- 如果 a &lt; CF b 和 b &lt; CF < em> c ,然后 a &lt; CF c (&lt; CF 的传递性)< / LI>
- 如果 a &gt; CF b 和 b &gt; CF < em> c ,然后 a &gt; CF c (传递&gt; CF )< / LI>
注意上述条件是必要且足以确保 comparefn 将集合S划分为等价类,并且这些等价类是完全有序的。