不学不知道,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。

原文发布于微信公众号 - web前端教室(webfeel)

原文发表时间:2017-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GIS讲堂

面向对象的三个基本特征

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

1913
来自专栏互联网开发者交流社区

Java逻辑

1464
来自专栏前端吧啦吧啦

涨薪必备Javascript,快点放进小口袋!

3137
来自专栏智能算法

程序员必须了解的数据结构:Array、HashMap 与 List

当开发程序时,我们(通常)需要在内存中存储数据。根据操作数据方式的不同,可能会选择不同的数据结构。有很多常用的数据结构,如:Array、Map、Set、List...

1250
来自专栏公众号文章

Golang 入门系列(四)如何理解interface接口

前面讲了很多Go 语言的基础知识,包括go环境的安装,go语言的语法等,感兴趣的朋友,可以先看看之前的文章。https://www.cnblogs.com/zh...

822
来自专栏前端儿

表达式求值(1)

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值...

1862
来自专栏xx_Cc的学习总结专栏

iOS-正则表达式的简单使用

4277
来自专栏用户2442861的专栏

C++ string中的几个小陷阱,你掉进过吗?

http://blog.csdn.net/lanxuezaipiao/article/details/24885811

1232
来自专栏chenjx85的技术专栏

leetcode-179-Largest Number(理解规则,自定义cmp函数进行排序)

1、这道题给定一个vector,里面存放着int类型的非负整数,要求把这些非负整数拼起来,尽可能拼成一个最大的整数。

1843
来自专栏前端吧啦吧啦

涨薪必备Javascript,快点放进小口袋!

1402

扫码关注云+社区

领取腾讯云代金券