lessfish / underscore-analysis

【NO LONGER UPDATE】underscore-1.8.3.js 源码解读 & 系列文章(完)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

源码解读这半年

lessfish opened this issue · comments

作者:韩子迟

What?

不知不觉间,「Underscore 源码解读系列」进入了真正的尾声,也请允许我最后一次 po 下项目的原始地址 https://github.com/hanzichi/underscore-analysis

这半年以来,花费了大量的业余时间,共计写了 25 篇随笔(包括此文),也给 underscore-1.8.3 的源码加了差不多 1500 行 注释,对于当初说的要做「史上最详细的 underscore 源码剖析」,至此我也觉得问心无愧。

本文不想说我在这个过程中学到了什么,学到的东西,能写的都在前面 24 篇随笔中了,只能意会的我也说不出来(感触最深的是闭包的强大)。本文是一篇「水文」,不谈技术,抛开代码,听楼主扯扯淡。

Why Underscore?

早期的几篇随笔都有「Why Underscore」这一节:

阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多。为什么是 Underscore?最主要的原因是 Underscore 简短精悍(约 1.5k 行),封装了 100 多个有用的方法,耦合度低,非常适合逐个方法阅读,适合楼主这样的 JavaScript 初学者。从中,你不仅可以学到用 void 0 代替 undefined 避免 undefined 被重写等一些小技巧 ,也可以学到变量类型判断、函数节流&函数去抖等常用的方法,还可以学到很多浏览器兼容的 hack,更可以学到作者的整体设计思路以及 API 设计的原理。

其实这并不是直接原因,「导火索」是当时(三月末)学习函数节流和函数去抖的时候,发现很多文章混淆了这两个概念,了解到 Underscore 封装了这两个函数,但是一用却发现了它的 BUG!(详见 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考 一文)

Underscore 早些年就接触过,对其的了解也仅限于「一个轻巧的工具库」,会不会还有其他的 BUG?同时源码这么短(之前想过看 jQuery,被接近 1w 行吓回来了),耦合度低(可以一个个方法分开看),也进一步激发了通篇解读的兴趣,想着这一路下来肯定能学到不少东西。好东西要与大家分享,同时确定了写系列文章的 idea。

Where to write?

哪里写?想都没想就确定了主战场 GitHub。之前我是不玩 GitHub 的,现在已经离不开了,每天不刷个几十次都手痒。为什么确定在 GitHub?理由很简单,GitHub 有逼格啊(毕竟是全球最大的同性交友社区)。

当然,酒香也怕巷子深,写完了没人看无疑是对自信心的极大打击,同时也需要大家来提出宝贵的意见。为此,几乎每一篇完成后,都会在以下渠道分享:

其实主要就是前三个,后面两个用了一段时间感觉不大好就不用了。极客头条个人感觉分类有点乱,同时因为是 CSDN 旗下的,个人对 CSDN 没太多好感;干货集中营的话,维护者是「daimajia」大大,感觉移动开发者关注的会比较多。

分享的话,如果脸皮厚的话,也可以在微博艾特一些圈内大大们(楼主脸皮比较薄 ...)。

当然,我不仅在 GitHub 的 issue 里写,还在以下一些渠道写:

简书的话,后面断断续续不更了,个人喜欢专门的 IT 类博客,而且觉得简书的 Markdown 渲染有问题,为什么都说它的 Markdown 体验好 ... sf 和 伯乐在线 的话,阅读量还是可以的,只是它们不是专门做博客系统的,基础的分类归档功能都没有(或许是我没找到?),以后应该还是会以博客园为主要战场。

Then?

underscore.js 的源码解读画上了句号,接下去干嘛?其实楼主对以下几个库也挺感兴趣的。

End

那就这样吧,749 Star / 140 Watch / 153 Fork 算是对我的肯定和鼓励吧 ^_^

也许我韩子迟还会回来的!

lodash+1

lodash+1

commented

lodash +11

lodash +1

lodash+1

@lixuejiang 这个还真不是

commented

写的很不错,点个赞

想你学习了。我打算追随你的脚步了。我作为js初学者,只是对几个重要的概念有了了解,但是还没有真正的深入研究过使用过。

学习大牛,刻骨专研的精神。

_.contains = _.includes = _.include = function (obj, item, fromIndex, guard) {
// 代码
};
这个方法第四个参数的作用是什么?

commented

lodash+1 前不久细读过源代码,奈何水平不够,很多看不懂

楼主好人,楼主加油。

学到了很多,谢谢,期待看到楼主继续出其他解读的文章

楼主在underscore的解读中的2200-2201行标注了
// 这一步有必要?
var obj = Object(object);
我在看这里的时候发现_.isMatch方法中只对传入的attrs进行了对象检测,而没有对object进行检测,所以传入的object参数可能并不是一个对象,也可以是单纯的字符串
比如: object是 'string',而attrs是 ['s', 't', 'r', 'i', 'n', 'g']
如果源码中没有 var obj = Object(object); 这一句的话,将会在执行2211行中的 key in obj 时报错:Uncaught TypeError: Cannot use 'in' operator to search for '0' in string at Function._.isMatch
具体为什么我也没弄懂,真萌新菜鸟一枚。。只是知道了这一步是有必要的

感谢这么好的文章,这么好的注释;作为初学者,看不懂underscore 码源,英语不好,看会头大,哈哈,今天终于找到这么好的文章,饿要开心的看下去了,,再次感谢!!

lodash +1000000

但是 lodash 的代码比较多,拆的比较细,提取不少了 internal方法,写的不如 underscore 直白,看的时候很蛋疼。

不晓得楼主有什么比较好的方式呢?

ramda +10086

commented

good!