sort()方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的
如果sort函数中没有参数的话,那么按照定义元素会按照转换为的字符串的诸个字符的 Unicode 位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前,而比较的数字会先被转换为字符串,所以在 Unicode 顺序上 "80" 要比 "9" 要靠前。
为了按照其他方式(比较数字)而非字母表顺序进行排序,我们可以在调用sort方法的时候,传入一个回调函数(compareFn),从而改变 sort 方法的排序方式。
下面为sort方法的示例:
const num = [4, 20, 5, 1, 3];
num.sort();
console.log(num);// Expected output:[1, 20, 3, 4, 5]
num.sort((a, b) => a - b);
console.log(num);// Expected output:[1, 3, 4, 5, 20]
num.sort((a, b) => b - a);
console.log(num);// Expected output:[20, 5, 4, 3, 1]
在这有一个问题,为什么上面返回 a - b 就是升序,返回 b - a 就是降序了呢?
如果指明了compareFn ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
compareFn(a, b) 返回值 |
排序顺序 |
---|---|
> 0 | a 在 b 后 |
< 0 | a 在 b 前 |
=== 0 | 保持 a 和 b 的顺序 |
所以,
当 a>b 时,
a - b > 0 ,排序结果 ===> b,a (升序)
b - a < 0 ,排序结果 ===> a,b (降序)
当 b>a 时,
a - b < 0 ,排序结果 ===> a,b (升序)
b - a > 0 ,排序结果 ===> b,a (降序)
当 a=b 时,
a - b = b - a =0 , 排序结果 ===> 保持不变
由此看出,无论a>b还是b>a,return a-b 总能得到升序的结果,而 return b-a 总能得到降序的结果。