不学不知道,sort()方法中的坑

时间:2022-04-27
本文章向大家介绍不学不知道,sort()方法中的坑,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天的前端零基础课,在讲到js中的sort()排序方法的时候,说sort()这个方法在给数字排序的时候,根本不是按数字大小来排序的。

它是把数字都当成字符串来看待,都给你转成string,然后根据对应的Unicode的大小顺序来排序。如果没有研究过sort()方法的同学,这个地方估计难免要掉坑里。

////////

Unicode码是啥?

它是一个字符集,说是给每种语言中的每个字符设置了统一并唯一的二进制编码。但简单的讲,它就是0 - 65535 之间的整数。你就认为,Unicode编码就是每个字符对应一个数字就可以了。

////////

刚才说到在sort()方法中,数字也给转成了Unicode码,然后才排序。那到底是怎么排的呢?咱们来看一个例子,

这是个数组,里面都是数字

var arr = [8,4,27,16,9];
// 转为 Unicode之后是这样,
[56,52,50,49,57]
// 按Unicode大小排序之后是这样,
[49,50,52,56,57]
// Unicode对应的数字就是下面这样了,
[16,27,4,8,9]

所以运行结果就是下面这样,

////////

那如果想要获得正确的数字排序,该怎么做呢?

sort()方法接收一个可选的参数,是用来规定“排序的规则”,必须是函数,有二个形参,

function setSort(a,b){
 <!-- console.log(a,b) -->
 return b-a;
}

它要返回三个值;

1,当第一个参数 > 第二个参数的时候,返回1;

b前a后;(相邻元素的位置)

2,当第一个参数 < 第二个参数的时候,返回的是-1;

a前b后;

3,当第一个参数 等于 第二个参数的时候,它返回的是0;

就不交换位置,但这个0,以前存在一些浏览器兼容的问题。

简单化的理解,就是:

1,a-b,从小到大排序;

2,b-a,从大到小排序;

这个排序算法,其实是一冒泡算法,两两比较。

简单点写就是这样,

[8,4,27,16,9].sort(function(a,b){
 return a-b;
});

////////

另外还有一些sort()的背景知识,大家也要尽量了解。这样在面试的面谈阶段的时候,会比较有谈得来的感觉。

sort()兼容性问题:

ECMAscript规范中并未规定具体的sort算法。

所以每个浏览器,都有自己对于sort排序方法的实现。

它并不是js当中的标准所规定的。

google它的浏览器使用的是v8引擎的内核,

v8引擎有二种排序,

1、InsertionSort [ɪnˈsɜ:ʃən];插入排序

2、QuickSort;快排

数量小于10的数组使用 InsertionSort,

比10大的数组则使用 QuickSort。