如果我这样做
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'].sort( function(a,b){ return a.length - b.length } )
输出
[" a"," b"," c"," d"," e",& #34; f"," g"," h"," i"," k"]
但是当我这样做时(最后添加了一个元素' l'
)['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l'].sort( function(a,b){ return a.length - b.length } )
输出
[" f"," a"," c"," d"," e",& #34; b"," g"," h","我"," k"," l&# 34]
为什么会发生这种情况有什么具体原因还是这只是一个怪癖?
PS:与this question有关。我在chrome上进行了测试,从昨天起它就一直困扰着我。)
答案 0 :(得分:4)
我还没有找到当前V8代码中的章节和节目,但this bug ticket表示Chrome对长度为< = 10的数组使用插入排序,否则会快速排序。
插入排序算法是稳定的,也就是说,给定两个相等的元素,它将保留它们在数组中的相对位置。另一方面,快速排序算法是不稳定的 - 它会在随机相对位置留下相等的元素。
这是所有允许的per the specification:
排序不一定稳定(也就是说,比较相等的元素不一定保持原始顺序)
用户不得依赖排序顺序为确定性。
答案 1 :(得分:1)
按照所有值(即1)的标准(长度)排序。因此,任何订单都是正确排序的。如果输入已经排序,则本机排序实现不保证保持顺序。
答案 2 :(得分:0)
行为很可能是由实施引起的(例如快速排序)。但请记住,javascript在这里表现正常。
比较函数的合约表示如果返回0,则两个值都相等,并且它们的顺序无关紧要。 它并没有说它们应该保持相同的顺序。
我为什么得到这些重新获得的理论是,quicksort递归地将你的数组分成两半。对于具有奇数长度的数组,对于具有奇数长度的数组,这很可能会产生不同的结果。
答案 3 :(得分:-1)
这是因为JavaScript VM中实现了Quicksort。您的自定义函数在任何情况下都返回0,因为您的所有字符串长度都是1,因此它基本上就像:
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'].sort( function(a,b){ return 0 } )