美文网首页Web 前端开发 让前端飞
由一道数组排序题引发的与V8引擎源码的美丽邂逅

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

作者: 趁你还年轻233 | 来源:发表于2016-11-27 15:36 被阅读0次

一、冒泡排序

二、数组重排序

          数组的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://img.haomeiwen.com/i2976869/157e8624bcdfd62a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

相关文章

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/kwhnpttx.html