你只知道sort方法 a - b 可以排序?让我们来聊聊 sort 的运行机制

290 阅读3分钟

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 的底层原理就是:

每次两个两个对比:

  1. 当返回值小于 0,a 就会被移动到 b 前面
  2. 当返回值大于 0,a 就会被移动到 b 后面
  3. 当返回值等于 0,a 和 b 的位置相对不变,但不是所有的游览器都遵循。

从上我们可以得知 a - b,就是升序排序,也就是从小到大,b - a 就是降序排序,也就是从大到小排序

本期的内容到这里就结束了,如果你觉得这份文章很有用,别忘了点赞收藏起来,谢谢大家!