摘要:寫在前面專題系列是我寫的第二個系列,第一個系列是深入系列。專題系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點贊,鼓勵指正。
寫在前面
JavaScript 專題系列是我寫的第二個系列,第一個系列是 JavaScript 深入系列。
JavaScript 專題系列共計 20 篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖、節(jié)流、去重、類型判斷、拷貝、最值、扁平、柯里、遞歸、亂序、排序等,特點是研(chao)究(xi) underscore 和 jQuery 的實現(xiàn)方式。
JavaScript 專題系列自 6 月 2 日發(fā)布第一篇文章,到 10 月 20 日發(fā)布最后一篇,感謝各位朋友的收藏、點贊,鼓勵、指正。
20 篇下來,我們已經(jīng)跟著 underscore 寫了 debounce、throttle、unique、isElement、flatten、findIndex、findLastIndex、sortedIndex、indexOf、lastIndexOf、eq、partial、compose、memorize 共 14 個功能函數(shù),跟著 jQuery 寫了 type、isArray、isFunction、isPlainObject、isWindow、isArrayLike、extend、each 共 8 個功能函數(shù),自己實現(xiàn)了 shallowCopy、deepCopy、curry、shuffle 共 4 個功能函數(shù),加起來共有 26 個功能函數(shù),除此之外,最后一篇還研究了 V8 的排序源碼,真心希望讀者能從這個系列中收獲頗豐。
順便宣傳一下該博客的 Github 倉庫:https://github.com/mqyqingfeng/Blog,歡迎 star,鼓勵一下作者。
而此篇,作為專題系列的總結(jié)篇,除了匯總各篇文章,作為目錄篇之外,還希望跟大家聊聊,我為什么要寫這個系列?
我為什么寫專題系列?如果說深入系列是為了了解 JavaScript 這門語言本身,專題系列就是為了用 JavaScript 具體實現(xiàn)一些功能,我希望它抽離于實踐,無關(guān)乎 DOM、BOM,能對大家有所幫助,一想到這些,映入腦海的竟是那些年做過的前端面試題……
是的,回顧整個系列,你會發(fā)現(xiàn),防抖、節(jié)流、去重、深淺拷貝、數(shù)組扁平化、亂序、柯里化等等不都是面試的經(jīng)典嗎?我還記得曾經(jīng)為了準(zhǔn)備面試,死記硬背了一個去重的函數(shù),卻從來沒有研究過其他去重的方法,也從來沒有想過它們之前的區(qū)別,防抖和節(jié)流更是傻傻分不清楚,深淺拷貝反正有 jQuery 的 extend 呢,數(shù)組扁平化,我也就有一個遞歸的思路,具體怎么實現(xiàn)我還真是不清楚,亂序我就沒有思路了……哎,都是一知半解或是只是有所耳聞。
想著想著,便不知不覺寫下了很多待研究的課題,研究的方法也隨之浮現(xiàn),那就是研究 underscore 以及 jQuery 的實現(xiàn)方式,曾經(jīng)它們看起來很是神秘,也知道閱讀起來并非難事,可還是想一探究竟。
然而研究的過程確實是十分的艱難,因為要做到看懂源碼,理解實現(xiàn)的原理,然而,一段源碼的實現(xiàn)往往會牽涉到多個地方,結(jié)果為了看懂某一個函數(shù)的具體實現(xiàn),還要一連串的看多個函數(shù),在理解源碼的過程中,也會有很多的疑惑,我會告訴自己去理解每一個產(chǎn)生疑惑的地方,這句話說起來簡單,做起來很難,我來舉個例子吧,在數(shù)組亂序中,有一個方法是:
arr.sort(function(){ return Math.random() - 0.5; });
然而,這個方法的實現(xiàn)是有問題的,它并不能做到真正的亂序。很多文章中,只是用 demo 驗證了這種方法有問題,卻從來沒有說過這個方法究竟哪里有問題,然而我就是對此感到非常疑惑,因為我覺得這個方法很不錯呀,思路巧妙,初見時,還有點小驚艷呢……可是為什么會有問題呢?我百思不得其解,搜了很多文章,也無果,最終,為了解決這個困惑,去看了 v8 的 sort 源碼,然而這段源碼也并不是很容易看的,資料少之又少,先要理解插入排序,快速排序,再去理解 v8 做的諸多優(yōu)化,結(jié)果為了解決這個疑惑,看完了 v8 的 sort 源碼,理解了 sort 的原理后,以數(shù)組 [1, 2, 3] 為例,細細分析這種亂序方法在 v8 下具體的排序過程,最后算出來 [1, 2, 3] 亂序后的 6 種結(jié)果的概率分別是多少,結(jié)果 3 還在原位置的概率有 50%! 到此,才算是心滿意足的解決了這個困惑。
關(guān)于這個困惑的具體內(nèi)容,可以查看該系列的第 19 篇文章。
除此之外,所有的函數(shù)我都會自己實現(xiàn)一遍,然而即便看懂了原理,實現(xiàn)也并非能一蹴而就,畢竟如果是你寫,怎么能一開始就想得如此完善呢?所以我都是從一個簡單的寫法開始,向著 underscore 和 jquery 的最終實現(xiàn)方式,一個功能一個功能的迭代實現(xiàn),你看這個系列很多的文章,都會跟大家講解如何從零實現(xiàn),一版一版的代碼其實就是迭代實現(xiàn)時的記錄。
感嘆一下,寫文章不容易呀~
全目錄JavaScript專題之跟著underscore學(xué)防抖
JavaScript專題之跟著underscore學(xué)節(jié)流
JavaScript專題之?dāng)?shù)組去重
JavaScript專題之類型判斷(上)
JavaScript專題之類型判斷(下)
JavaScript專題之深淺拷貝
JavaScript專題之從零實現(xiàn)jQuery的extend
JavaScript專題之如何求數(shù)組的最大值和最小值
JavaScript專題之?dāng)?shù)組扁平化
JavaScript專題之學(xué)underscore在數(shù)組中查找指定元素
JavaScript專題之jQuery通用遍歷方法each的實現(xiàn)
JavaScript專題之如何判斷兩個對象相等
JavaScript專題之函數(shù)柯里化
JavaScript專題之偏函數(shù)
JavaScript專題之惰性函數(shù)
JavaScript專題之函數(shù)組合
JavaScript專題之函數(shù)記憶
JavaScript專題之遞歸
JavaScript專題之亂序
JavaScript專題之解讀v8排序源碼
致歉有些讀者給我的文章留言,或感謝,或討論,或指正,因為各種各樣的原因,沒能回復(fù)或及時回復(fù),對此致以歉意。
下期預(yù)告在我 Github 博客倉庫的描述中,說到我預(yù)計寫四個系列:JavaScript深入系列、JavaScript專題系列、ES6系列、React系列。專題系列完結(jié),本來應(yīng)該是寫 ES6 系列,可是有一個朋友跟我說,寫了這么多函數(shù),可是該如何組織這些函數(shù),形成自己的工具函數(shù)庫呢?
對呀,既然都寫了這么多工具函數(shù),為什么不再進一步,將它們以某種方式組織起來呢?
我首先想到的便是借鑒 underscore,underscore 是如何組織代碼的?又是如何實現(xiàn)鏈?zhǔn)秸{(diào)用的?又是如何實現(xiàn)拓展的?有很多值得研究的地方,所以我決定,在 ES6 系列之前,再進一步,寫一個 underscore 系列,旨在幫助大家寫出一個自己的 “underscore”。
感謝大家的閱讀和支持,我是冴羽,underscore 系列再見啦![]~( ̄▽ ̄)~**
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89310.html
摘要:寫在前面深入系列共計篇已經(jīng)正式完結(jié),這是一個旨在幫助大家,其實也是幫助自己捋順底層知識的系列。深入系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點贊,鼓勵指正。 寫在前面 JavaScript 深入系列共計 15 篇已經(jīng)正式完結(jié),這是一個旨在幫助大家,其實也是幫助自己捋順 JavaScript 底層知識的系列。重點講解了如原型、作用域、執(zhí)行上下文、變量對象、this、...
摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現(xiàn)一個 jQuery 的 ext...
摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:所以它與其他系列的文章并不沖突,完全可以在閱讀完這個系列后,再跟著其他系列的文章接著學(xué)習(xí)。如何閱讀我在寫系列的時候,被問的最多的問題就是該怎么閱讀源碼我想簡單聊一下自己的思路。感謝大家的閱讀和支持,我是冴羽,下個系列再見啦 前言 別名:《underscore 系列 8 篇正式完結(jié)!》 介紹 underscore 系列是我寫的第三個系列,前兩個系列分別是 JavaScript 深入系列、...
摘要:忍者級別的函數(shù)操作對于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數(shù)是一個很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機制,如果...
閱讀 2666·2021-11-23 09:51
閱讀 3254·2021-11-22 14:44
閱讀 4586·2021-11-22 09:34
閱讀 5131·2021-10-08 10:14
閱讀 2450·2021-09-22 15:47
閱讀 3517·2021-09-22 15:40
閱讀 1520·2019-08-30 15:44
閱讀 1630·2019-08-28 18:23