对于相同的代码,我在Chrome 70.0,Chrome 69.0和Firefox 63.0中获得了不同的输出。
var arr = [1,2,43,1233,5546,33,6,11];
arr.sort(() => -1); //[11, 6, 33, 5546, 1233, 43, 2, 1]
arr.sort(() => 1); //[1, 2, 43, 1233, 5546, 33, 6, 11]
Chrome 69.0
答案 0 :(得分:1)
Chrome 70将其排序算法更改为稳定的算法。稳定的排序算法按照相同元素在输入[0]中出现的顺序对其进行排序。
Array.prototype.sort现在在@ v8js v7.0 / Chrome 70中稳定!
以前,V8对数量超过10的阵列使用了不稳定的QuickSort 元素。现在,我们使用稳定的TimSort算法。 [1]
[0] https://en.wikipedia.org/wiki/Sorting_algorithm#Stability
[1] https://twitter.com/mathias/status/1036626116654637057?lang=sk
答案 1 :(得分:0)
这是数学问题,因为您提供的比较器不是有效的一般合同,因此您不能期望得到“常规结果”
if A > B then must B < A
if A > B then must NOT (B > A)
if A > B and B > C then must A > C
但是使用您提供的比较器()=> 1 ,A> B和B> A的同时,这没有任何意义!
FYI ,在 Java 中,他们对此有警告,并且在某些情况下,如果您不遵循,可能会出现“比较方法违反其一般合同”例外:
实施者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-T-T-