sort方法,想必大家都用过,但是它的运行机制你们真的了解吗?还是真的只会 a - b来进行排序,今天我就开始讲解 sort 方法的运行机制
首先,我们来看一个示例:
const arr = [8,5,10,2,94,24,4,6,84]
const result = arr.sort((a,b) => a - b)
console.log(result) // [ 2, 4, 5, 6, 8, 10, 24, 84, 94 ]
想必用过的人都知道结果
那么大家知道下面的输出结果是什么吗?:
[3,18,8,28,102,22].sort()
// 换成字母呢
['black','aoc','huawei','xiaomi'].sort()
// 换成 数字、字母 呢?
['black','aoc',1,5,8,'huawei','xiaomi'].sort()
// 换成 数字、字母、汉字呢?
['black','aoc',1,'努力学前端的小胡',5,8,'Huawei','Xiaomi'].sort()
如果你都能答出来,那么说明你通关了!
要想知道上面的运行结果,我们就必须知道 sort 方法的运行机制:
首先 sort 是根据 unicode 的 utf-16 进行排序的,我们这就来简单讲解一下 unicode 的排序规则:
数字 -> 英语大写字母 -> 英语小写字母 -> 汉字
但是我们知道在 js 中,数字 是没办法跟 字符串做比较的,所以 js 会将 数字 转换成字符串,然后就可以根据 unicode 来进行排序了
然后需要注意的就是 unicode 只有 0-9 的数字,所以数字排序是根据数字的第一个字符进行对比,然后第二个字符,以此类推,注意,如果一个数字有两位,一个数字有三位,那么第三位将不对比
所以根据此排序规则,上述代码的运行结果为:
[3,18,8,28,102,22].sort() // 结果 [102, 18, 22, 28, 3, 8]
['black','aoc','huawei','xiaomi'].sort() // 结果 ['aoc', 'black', 'huawei', 'xiaomi']
['black','aoc',1,5,8,'huawei','xiaomi'].sort() // 结果 [1, 5, 8, 'aoc', 'black', 'huawei', 'xiaomi']
['black','aoc',1,'努力学前端的小胡',5,8,'Huawei','Xiaomi'].sort() // 结果 [1, 5, 8, 'Huawei', 'Xiaomi', 'aoc', 'black', '努力学前端的小胡']
介绍完之后,我还有一个问题问大家,sort((a,b) => a - b) 就可以排序的运行机制是什么?
首先我们先来输出一下这两个参数
const arr = [3,15,8,29,102,21]
arr.sort(function(a,b)=>{
console.log(a,b) // 输出 15,3 8,15 以此类推...
return a - b // 那么 a - b 就是 15 - 3 8 -15 以此类推...
})
从上我们可以得知 sort 的底层原理就是:
每次两个两个对比:
- 当返回值小于 0,a 就会被移动到 b 前面
- 当返回值大于 0,a 就会被移动到 b 后面
- 当返回值等于 0,a 和 b 的位置相对不变,但不是所有的游览器都遵循。
从上我们可以得知 a - b,就是升序排序,也就是从小到大,b - a 就是降序排序,也就是从大到小排序
本期的内容到这里就结束了,如果你觉得这份文章很有用,别忘了点赞收藏起来,谢谢大家!