今天的前端零基础课,在讲到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。