由一道数组排序题引发的与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)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

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