由一道数组排序题引发的与V8引擎源码的美丽邂逅

一、冒泡排序

二、数组重排序

          数组的sort()方法传参为函数,并且直接运行了函数对数组中的每一项进行排序,排序原理是调用toString()方法转换为字符串,依据ASCII码值表进行排序。

           就是说在调用为sort()方法之前先对数据进行一个约束或者叫做处理,而不是直接拿来比较。

           那么为什么定义的函数内部,返回-1将后面较大的元素放到前面呢,目前我的猜测是这个-1会被传到一个浏览器引擎预定义好的方法中,这个方法应该就是sort()方法,传入-1,两个数字调换顺序,传入1,不换顺序,传入0时也不换顺序。

           所以说sort方法接受到的参数不是函数,而是数组内每一项调用toString()方法并且调用传入的函数之后返回的-1,1,0,具体内部sort()方法为什么可以传入-1,1,0能够进行排序,我想这个时候就要去看浏览器提示或者V8引擎的源码了。

三、初试看V8引擎源码

①chrome控制台tips:

数组的sort()方法函数内部结构:唯一能看懂的就是内部又定义了一堆方法。

②V8引擎sort()源码:

          我竟然看看懂一部分,InnerArray定义了三个参数,第一个是执行sort方法的数组,第二个是数组长度,第三个是调用的函数。

注释:

          来代替快速排序的一种算法

          仅限于数组长度小于22的数组排序(数据量大时可能需要其他方法)

           下面这些带代码的意思就是说,没有传入函数的话,就使用我预先定义好的comparefn函数进行排序,具体的还有两个什么%_IsSmi(x)Smile(微笑什么鬼函数),这些函数肯定是在其它地方定义好的,暂时我们先不去管。

          这里的TO_STRING方法告诉我们,sort()方法内部进行元素处理时的就是传说中的toString()方法。

          下面的InsertionSort还真是使用的冒泡排序。说明算法可能比语言更重要,现在明白为什么大公司喜欢招科班出身的人才了。

四、思考

不止要知其然,而且要知其所以然!

永远都不要去猜,而是去实实在在得寻找根源上的问题!

现在总算明白了算法的重要性,而语言只是工具!

努力成为优秀的前端工程师!

>期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:

> - SegmentFault技术圈:[ES新规范语法糖](https://segmentfault.com/g/1570000010695363)

> - SegmentFault专栏:[趁你还年轻,做个优秀的前端工程师](https://segmentfault.com/blog/chennihainianqing)

>- 知乎专栏:[趁你还年轻,做个优秀的前端工程师](https://zhuanlan.zhihu.com/wyasy)

>- Github博客: [趁你还年轻233的个人博客](https://github.com/FrankKai/FrankKai.github.io)

>- 前端开发QQ群:660634678

>- 微信公众号: 人兽鬼 / excellent_developers

![](https://upload-images.jianshu.io/upload_images/2976869-157e8624bcdfd62a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

>努力成为优秀前端工程师!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,268评论 0 4
  • 数组总共有22种方法,本文将其分为对象继承方法、数组转换方法、栈和队列方法、数组排序方法、数组拼接方法、创建子数组...
    Sachie阅读 924评论 0 7
  • 数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引。 JavaScript...
    劼哥stone阅读 1,142评论 6 20
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,290评论 0 3
  • 本章内容 使用对象 创建并操作数组 理解基本的 JavaScript 类型 使用基本类型和基本包装类型 引用类型的...
    闷油瓶小张阅读 695评论 0 0