一、冒泡排序
二、數(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:
②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

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