Array.prototype.sort()

1,640 阅读2分钟

JavaScript 的 sort 方法

先上结论

使用 sort() 方法对数组进行排序时,最好指定它的参数,否则会出现意料之外的结果,具体请往下看

语法

arr.sort([compareFunction])

参数

compareFunction 可选参数(最好提供)

用来指定数组元素按照某种顺序进行排列的函数,如果省略,则先将元素转换为字符串,然后按照字符串的各个字符的Unicode位点进行排序

  • firstEl

第一个用于比较的元素 *secondEl 第二个用于比较的元素

返回值

排序后的数组,数组已进行原地排序,不会产生新的数组

描述

sort() 方法用原地算法对数组的元素进行排序,并返回排序后的数组(会改变数组本身)。默认的排序方式是先将元素转换成字符串,然后按照字符串的各个字符的Unicode位点进行排序。

举个例子

没有指明 compareFunction

默认的排序顺序是由小到大

const arr = [80, 9, 3, 4, 1]
arr.sort()
// [1, 3, 4, 80, 9]
console.log(arr)

大家对80和9的顺序肯定有疑问,这是因为我们没有指定 compareFunction,所以会将数组元素先转换成字符串,然后对字符串的各个字符串的Unicode位点进行排序,然而在Unicode顺序上,'80'要比'9'要靠前

提供 compareFunction

如果指定了 compareFunction,那么数组会按照调用该函数的返回值进行排序,即 a 和 b 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) 小于 0, 那么 a 会排在 b 的前面
  • 如果 compareFunction(a, b) 大于 0, 那么 a 会排在 b 的后面
  • 如果 compareFunction(a, b) 等于 0, 那么 a 和 b 的相对位置不变
const arr = [80, 9, 3, 4, 1]
arr.sort()
// [1, 3, 4, 9, 80]
console.log(arr)

所以重复一遍结论

靠谱的做法是始终传递 compareFunction 参数,告诉 sort 方法排序规则是什么。

参考

MDN