JavaScript 专题系列是我写的第二个系列,第一个系列是 JavaScript 深刻系列。前端
JavaScript 专题系列共计 20 篇,主要研究平常开发中一些功能点的实现,好比防抖、节流、去重、类型判断、拷贝、最值、扁平、柯里、递归、乱序、排序等,特色是研(chao)究(xi) underscore 和 jQuery 的实现方式。jquery
JavaScript 专题系列自 6 月 2 日发布第一篇文章,到 10 月 20 日发布最后一篇,感谢各位朋友的收藏、点赞,鼓励、指正。git
20 篇下来,咱们已经跟着 underscore 写了 debounce、throttle、unique、isElement、flatten、findIndex、findLastIndex、sortedIndex、indexOf、lastIndexOf、eq、partial、compose、memorize 共 14 个功能函数,跟着 jQuery 写了 type、isArray、isFunction、isPlainObject、isWindow、isArrayLike、extend、each 共 8 个功能函数,本身实现了 shallowCopy、deepCopy、curry、shuffle 共 4 个功能函数,加起来共有 26 个功能函数,除此以外,最后一篇还研究了 V8 的排序源码,真心但愿读者能从这个系列中收获颇丰。github
顺便宣传一下该博客的 Github 仓库:https://github.com/mqyqingfeng/Blog,欢迎 star,鼓励一下做者。面试
而此篇,做为专题系列的总结篇,除了汇总各篇文章,做为目录篇以外,还但愿跟你们聊聊,我为何要写这个系列?数组
若是说深刻系列是为了了解 JavaScript 这门语言自己,专题系列就是为了用 JavaScript 具体实现一些功能,我但愿它抽离于实践,无关乎 DOM、BOM,能对你们有所帮助,一想到这些,映入脑海的竟是那些年作过的前端面试题……dom
是的,回顾整个系列,你会发现,防抖、节流、去重、深浅拷贝、数组扁平化、乱序、柯里化等等不都是面试的经典吗?我还记得曾经为了准备面试,死记硬背了一个去重的函数,却历来没有研究过其余去重的方法,也历来没有想过它们以前的区别,防抖和节流更是傻傻分不清楚,深浅拷贝反正有 jQuery 的 extend 呢,数组扁平化,我也就有一个递归的思路,具体怎么实现我还真是不清楚,乱序我就没有思路了……哎,都是只知其一;不知其二或是只是有所耳闻。函数
想着想着,便不知不觉写下了不少待研究的课题,研究的方法也随之浮现,那就是研究 underscore 以及 jQuery 的实现方式,曾经它们看起来非常神秘,也知道阅读起来并不是难事,可仍是想一探究竟。工具
然而研究的过程确实是十分的艰难,由于要作到看懂源码,理解实现的原理,然而,一段源码的实现每每会牵涉到多个地方,结果为了看懂某一个函数的具体实现,还要一连串的看多个函数,在理解源码的过程当中,也会有不少的疑惑,我会告诉本身去理解每个产生疑惑的地方,这句话提及来简单,作起来很难,我来举个例子吧,在数组乱序中,有一个方法是:优化
arr.sort(function(){ return Math.random() - 0.5; });
然而,这个方法的实现是有问题的,它并不能作到真正的乱序。不少文章中,只是用 demo 验证了这种方法有问题,却历来没有说过这个方法究竟哪里有问题,然而我就是对此感到很是疑惑,由于我以为这个方法很不错呀,思路巧妙,初见时,还有点小惊艳呢……但是为何会有问题呢?我百思不得其解,搜了不少文章,也无果,最终,为了解决这个困惑,去看了 v8 的 sort 源码,然而这段源码也并非很容易看的,资料少之又少,先要理解插入排序,快速排序,再去理解 v8 作的诸多优化,结果为了解决这个疑惑,看完了 v8 的 sort 源码,理解了 sort 的原理后,以数组 [1, 2, 3] 为例,细细分析这种乱序方法在 v8 下具体的排序过程,最后算出来 [1, 2, 3] 乱序后的 6 种结果的几率分别是多少,结果 3 还在原位置的几率有 50%! 到此,才算是心满意足的解决了这个困惑。
关于这个困惑的具体内容,能够查看该系列的第 19 篇文章。
除此以外,全部的函数我都会本身实现一遍,然而即使看懂了原理,实现也并不是能一蹴而就,毕竟若是是你写,怎么能一开始就想得如此完善呢?因此我都是从一个简单的写法开始,向着 underscore 和 jquery 的最终实现方式,一个功能一个功能的迭代实现,你看这个系列不少的文章,都会跟你们讲解如何从零实现,一版一版的代码其实就是迭代实现时的记录。
感叹一下,写文章不容易呀~
有些读者给个人文章留言,或感谢,或讨论,或指正,由于各类各样的缘由,没能回复或及时回复,对此致以歉意。
在我 Github 博客仓库的描述中,说到我预计写四个系列:JavaScript深刻系列、JavaScript专题系列、ES6系列、React系列。专题系列完结,原本应该是写 ES6 系列,但是有一个朋友跟我说,写了这么多函数,但是该如何组织这些函数,造成本身的工具函数库呢?
对呀,既然都写了这么多工具函数,为何再也不进一步,将它们以某种方式组织起来呢?
我首先想到的即是借鉴 underscore,underscore 是如何组织代码的?又是如何实现链式调用的?又是如何实现拓展的?有不少值得研究的地方,因此我决定,在 ES6 系列以前,再进一步,写一个 underscore 系列,旨在帮助你们写出一个本身的 “underscore”。
感谢你们的阅读和支持,我是冴羽,underscore 系列再见啦![]~( ̄▽ ̄)~**