我发现使用不带比较功能的排序会导致错误的答案,我不知道原因。
var a = [823564440,115438165,784484492,74243042,114807987,137522503,441282327,16531729,823378840,143542612]
a.sort()
a.sort((a,b) => a-b)
这两个人应该在我的脑海中给出相同的结果,但事实并非如此。显然后者是正确的。
a.sort()
[114807987, 115438165, 137522503, 143542612, 16531729, 441282327, 74243042, 784484492, 823378840, 823564440]
a.sort((a, b) => a-b)
[16531729, 74243042, 114807987, 115438165, 137522503, 143542612, 441282327, 784484492, 823378840, 823564440]
谁能告诉我背后的原因?
答案 0 :(得分:5)
sort()
方法对数组中的元素进行排序并返回数组。排序不一定稳定。 默认排序顺序是根据字符串Unicode代码点。(强调我的)†
由于您未提供功能,因此使用默认排序顺序。因此,元素的排序就好像它们是 strings ,而后一种排序则根据数值进行排序。
因此,1
出现在2
之前,2
出现在3
之前等等,无论数字的位数如何逐个比较。 (参见list of unicode characters;因为Unicode中的1是U + 0031,它出现在U + 0032之前,因此更小)。
在您的示例中,这意味着115438165
在74243042
之前出现,尽管后者在数学上较小。由于字符串是逐个比较的,因此将1
与7
进行比较并小于,从而产生结果。如需进一步阅读,请参阅lexicographical order。
†这是按规格说明的。请参阅ECMAScript® 2015 Language Specification,第22.1.3.24.1节 - 运行时语义:SortCompare( x, y )
。这里,它解释了如果没有传递排序函数,则比较x
和y
(使用ToString
找到)的字符串表示。
答案 1 :(得分:3)
阅读文档。
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
如果未提供compareFunction,则通过将元素转换为字符串并按Unicode代码点顺序比较字符串来对元素进行排序。例如," Banana"来到" cherry"之前。在数字排序中,9出现在80之前,但由于数字被转换为字符串," 80"来之前" 9"按Unicode顺序。