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

Tho*_*ang 4 javascript

我发现使用sort而不比较函数会导致错误的答案,我不知道原因.

var a = [823564440,115438165,784484492,74243042,114807987,137522503,441282327,16531729,823378840,143542612]

a.sort()
a.sort((a,b) => a-b)
Run Code Online (Sandbox Code Playgroud)

这两个人应该在我的脑海中给出相同的结果,但他们没有.显然后者是正确的.

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]
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这背后的原因?

Li3*_*357 5

根据MDN文档:

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

由于您不提供功能,因此使用默认排序顺序.因此,元素的排序就像它们是字符串一样,而后一种类型则根据数字值进行排序.

因此,无论数字的位数如何逐个比较,1都可以在之前2,2之前3等.(参见unicode字符列表 ;因为Unicode中的1是U + 0031,所以它在U + 0032之前,因此更小).

在你的例子中,这意味着115438165之前会出现,74243042尽管后者在数学上较小.因为字符串逐个比较,1比较7并且小于,从而产生结果.有关进一步阅读,请参阅词典顺序.


†这是按规格说明的.请参阅ECMAScript®2015语言规范,第22.1.3.24.1节 - 运行时语义:SortCompare( x, y ).这里,它解释了如果没有传递排序函数,则比较xy(找到使用ToString)的字符串表示.