Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

源码解读这半年 #28

Open
lessfish opened this issue Nov 2, 2016 · 20 comments
Open

源码解读这半年 #28

lessfish opened this issue Nov 2, 2016 · 20 comments

Comments

@lessfish
Copy link
Owner

lessfish commented Nov 2, 2016

作者:韩子迟

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 算是对我的肯定和鼓励吧 ^_^

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

@waitinghope
Copy link

lodash+1

1 similar comment
@flashback313
Copy link

lodash+1

@Dmmo
Copy link

Dmmo commented Nov 8, 2016

lodash +11

@givebest
Copy link

givebest commented Nov 9, 2016

lodash +1

@geraldlrh
Copy link

lodash+1

@lessfish
Copy link
Owner Author

@lixuejiang 这个还真不是

@wanglinjiang
Copy link

写的很不错,点个赞

@BigKongfuPanda
Copy link

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

@MarioGogogo
Copy link

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

@xuexiaobin5
Copy link

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

@FrontToEnd
Copy link

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

@chiyanking
Copy link

楼主好人,楼主加油。

@yuchaoWu
Copy link

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

@ryan0217
Copy link

楼主在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
具体为什么我也没弄懂,真萌新菜鸟一枚。。只是知道了这一步是有必要的

@yuanxiaohuilearning
Copy link

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

@huyansheng3
Copy link

lodash +1000000

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

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

@ariesdevil
Copy link

ramda +10086

@echopairs
Copy link

good!

@xr-betty
Copy link

xr-betty commented Jun 14, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests