不学不知道,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。
- SpringBoot中自定义参数绑定
- ElementUI中tree控件踩坑记
- 一个隐马尔科夫模型的应用实例:中文分词
- 使用MyBatis轻松实现递归查询与存储过程调用
- Config Server——使用Spring Cloud Bus自动刷新配置
- Config Server——配置内容的加密与解密 详解
- 使用 HTML5 WebSocket 构建实时 Web 应用
- Mysql group by实现方式(一) - 临时表
- TensorFlow 入门
- Python 爬虫 1 快速入门
- Exim Off-by-one(CVE-2018-6789)漏洞复现分析
- 一文学会用 Tensorflow 搭建神经网络
- 数据降维处理:PCA之特征值分解法例子解析
- 理解Eureka的自我保护模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springBoot 入门(六)—— 整合Spring框架开启自带的任务调度器执行任务(注解方式)
- java字节流入门(缓冲输出流)
- EsotericSoftware Kryo —— 官方(1)
- Java的I/O类库的基本架构一句话介绍
- 树莓派综合项目1:智能温度测量系统实验
- 一句话ListenableFuture简介
- Google Guava Cache 使用
- Linux下安装maven3.6.2遇到的问题
- Unity3D网络通讯(五)--Socket通讯之Udp通讯
- IP不能作为rocketmq 的topic
- Unity3D网络通讯(六)-- UnityWebRequest实现WebService通讯
- Java Maven编译时没问题,运行时报java.lang.NoSuchMethodError
- 树莓派基础实验34:L298N模块驱动直流电机实验
- The consumer group[PushConsumer] has been created before, specify another name please
- 虚拟机系列 | JVM特点,基础结构与执行周期