一、冒泡排序
二、数组重排序
数组的sort()方法传参为函数,并且直接运行了函数对数组中的每一项进行排序,排序原理是调用toString()方法转换为字符串,依据ASCII码值表进行排序。
就是说在调用为sort()方法之前先对数据进行一个约束或者叫做处理,而不是直接拿来比较。
那么为什么定义的函数内部,返回-1将后面较大的元素放到前面呢,目前我的猜测是这个-1会被传到一个浏览器引擎预定义好的方法中,这个方法应该就是sort()方法,传入-1,两个数字调换顺序,传入1,不换顺序,传入0时也不换顺序。
所以说sort方法接受到的参数不是函数,而是数组内每一项调用toString()方法并且调用传入的函数之后返回的-1,1,0,具体内部sort()方法为什么可以传入-1,1,0能够进行排序,我想这个时候就要去看浏览器提示或者V8引擎的源码了。
三、初试看V8引擎源码
①chrome控制台tips:
②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)
>努力成为优秀前端工程师!