没有比较函数的Javascript Array.prototype.sort()错误

时间:2016-12-11 23:27:14

标签: javascript

我发现使用不带比较功能的排序会导致错误的答案,我不知道原因。

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]

谁能告诉我背后的原因?

2 个答案:

答案 0 :(得分:5)

根据MDN documentation

  

sort()方法对数组中的元素进行排序并返回数组。排序不一定稳定。 默认排序顺序是根据字符串Unicode代码点。(强调我的)†

由于您未提供功能,因此使用默认排序顺序。因此,元素的排序就好像它们是 strings ,而后一种排序则根据数值进行排序。

因此,1出现在2之前,2出现在3之前等等,无论数字的位数如何逐个比较。 (参见list of unicode characters;因为Unicode中的1是U + 0031,它出现在U + 0032之前,因此更小)。

在您的示例中,这意味着11543816574243042之前出现,尽管后者在数学上较小。由于字符串是逐个比较的,因此将17进行比较并小于,从而产生结果。如需进一步阅读,请参阅lexicographical order

†这是按规格说明的。请参阅ECMAScript® 2015 Language Specification第22.1.3.24.1节 - 运行时语义:SortCompare( x, y ) 。这里,它解释了如果没有传递排序函数,则比较xy(使用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顺序。