Array.sort()
sort()
ES6 中的 Array.prototype.sort()
方法有以下几个特点:
1、原地排序:sort()
方法会在原数组上进行排序,而不是创建一个新的排序后的数组。
2、默认的排序顺序是按照字符串的 Unicode
码点顺序:如果在 sort()
方法中没有提供比较函数,那么数组元素会先被转换为字符串,然后再按照字符的 Unicode
码点顺序进行排序。例如,数字数组 [10, 2, 11]
会被排序为 [10, 11, 2]
。
3、可以接受一个比较函数作为参数:你可以提供一个比较函数来自定义排序顺序。比较函数应该接受两个参数,返回一个负数、零或正数,来表示第一个参数应该排在第二个参数的前面、与第二个参数相等或后面。
4、稳定排序:从 ES2019 开始,Array.prototype.sort()
是稳定的。这意味着如果两个元素相等,它们的原始顺序会被保留
在 sort() 方法的比较函数 ((a, b) => a - b) 中,a 和 b 是数组中的两个元素。
当 sort() 方法执行排序时,它会遍历数组,每次选择两个元素,然后传递给比较函数。比较函数的任务是决定这两个元素的顺序。
例如,如果你有一个数组 [3, 1, 4] 并且你调用 sort((a, b) => a - b),那么在排序过程中,a 和 b 可能会是 (3, 1) 或者 (1, 4) 等等。
比较函数的返回值决定了 a 和 b 的排序顺序:
如果比较函数返回一个小于 0 的值,那么 a 会被排在 b 的前面。
如果比较函数返回 0,那么 a 和 b 的顺序不变。
如果比较函数返回一个大于 0 的值,那么 b 会被排在 a 的前面。
所以在 ((a, b) => a - b) 中,如果 a 小于 b,那么返回值是负数,a 会被排在 b 的前面,这就实现了升序排序。
结论是:b-a降序, a-b升序
a-b时,if a-b>0, b排前面,升序;if a-b<0, a排在前面,升序。
b-a时,if b-a>0, b排前面,降序;if b-a<0, a排在前面,降序。
1 | let arr2 = [8,1,5,9,3,4,2,6,7] |