由一道數(shù)組排序題引發(fā)的與V8引擎源碼的美麗邂逅

一、冒泡排序

二、數(shù)組重排序

? ? ? ? ? 數(shù)組的sort()方法傳參為函數(shù),并且直接運(yùn)行了函數(shù)對(duì)數(shù)組中的每一項(xiàng)進(jìn)行排序,排序原理是調(diào)用toString()方法轉(zhuǎn)換為字符串,依據(jù)ASCII碼值表進(jìn)行排序。

? ? ? ? ? ?就是說在調(diào)用為sort()方法之前先對(duì)數(shù)據(jù)進(jìn)行一個(gè)約束或者叫做處理,而不是直接拿來比較。

? ? ? ? ? ?那么為什么定義的函數(shù)內(nèi)部,返回-1將后面較大的元素放到前面呢,目前我的猜測(cè)是這個(gè)-1會(huì)被傳到一個(gè)瀏覽器引擎預(yù)定義好的方法中,這個(gè)方法應(yīng)該就是sort()方法,傳入-1,兩個(gè)數(shù)字調(diào)換順序,傳入1,不換順序,傳入0時(shí)也不換順序。

? ? ? ? ? ?所以說sort方法接受到的參數(shù)不是函數(shù),而是數(shù)組內(nèi)每一項(xiàng)調(diào)用toString()方法并且調(diào)用傳入的函數(shù)之后返回的-1,1,0,具體內(nèi)部sort()方法為什么可以傳入-1,1,0能夠進(jìn)行排序,我想這個(gè)時(shí)候就要去看瀏覽器提示或者V8引擎的源碼了。

三、初試看V8引擎源碼

①chrome控制臺(tái)tips:

數(shù)組的sort()方法函數(shù)內(nèi)部結(jié)構(gòu):唯一能看懂的就是內(nèi)部又定義了一堆方法。

②V8引擎sort()源碼:

? ? ? ? ? 我竟然看看懂一部分,InnerArray定義了三個(gè)參數(shù),第一個(gè)是執(zhí)行sort方法的數(shù)組,第二個(gè)是數(shù)組長(zhǎng)度,第三個(gè)是調(diào)用的函數(shù)。

注釋:

? ? ? ? ? 來代替快速排序的一種算法

? ? ? ? ? 僅限于數(shù)組長(zhǎng)度小于22的數(shù)組排序(數(shù)據(jù)量大時(shí)可能需要其他方法)

? ? ? ? ? ?下面這些帶代碼的意思就是說,沒有傳入函數(shù)的話,就使用我預(yù)先定義好的comparefn函數(shù)進(jìn)行排序,具體的還有兩個(gè)什么%_IsSmi(x)Smile(微笑什么鬼函數(shù)),這些函數(shù)肯定是在其它地方定義好的,暫時(shí)我們先不去管。

? ? ? ? ? 這里的TO_STRING方法告訴我們,sort()方法內(nèi)部進(jìn)行元素處理時(shí)的就是傳說中的toString()方法。

? ? ? ? ? 下面的InsertionSort還真是使用的冒泡排序。說明算法可能比語言更重要,現(xiàn)在明白為什么大公司喜歡招科班出身的人才了。

四、思考

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

永遠(yuǎn)都不要去猜,而是去實(shí)實(shí)在在得尋找根源上的問題!

現(xiàn)在總算明白了算法的重要性,而語言只是工具!

努力成為優(yōu)秀的前端工程師!

>期待和大家交流,共同進(jìn)步,歡迎大家加入我創(chuàng)建的與前端開發(fā)密切相關(guān)的技術(shù)討論小組:

> - SegmentFault技術(shù)圈:[ES新規(guī)范語法糖](https://segmentfault.com/g/1570000010695363)

> - SegmentFault專欄:[趁你還年輕,做個(gè)優(yōu)秀的前端工程師](https://segmentfault.com/blog/chennihainianqing)

>- 知乎專欄:[趁你還年輕,做個(gè)優(yōu)秀的前端工程師](https://zhuanlan.zhihu.com/wyasy)

>- Github博客: [趁你還年輕233的個(gè)人博客](https://github.com/FrankKai/FrankKai.github.io)

>- 前端開發(fā)QQ群:660634678

>- 微信公眾號(hào): 人獸鬼 / excellent_developers

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

>努力成為優(yōu)秀前端工程師!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,270評(píng)論 0 4
  • 數(shù)組總共有22種方法,本文將其分為對(duì)象繼承方法、數(shù)組轉(zhuǎn)換方法、棧和隊(duì)列方法、數(shù)組排序方法、數(shù)組拼接方法、創(chuàng)建子數(shù)組...
    Sachie閱讀 924評(píng)論 0 7
  • 數(shù)組是值的有序集合。每個(gè)值叫做一個(gè)元素,而每個(gè)元素在數(shù)組中有一個(gè)位置,以數(shù)字表示,稱為索引。 JavaScript...
    劼哥stone閱讀 1,144評(píng)論 6 20
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,298評(píng)論 0 3
  • 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的 JavaScript 類型 使用基本類型和基本包裝類型 引用類型的...
    悶油瓶小張閱讀 697評(píng)論 0 0