Why underscore
近来最先看 underscore源码,并将 underscore源码解读 放在了我的 2016设想 中。
浏览一些有名框架类库的源码,就好像和一个个巨匠对话,你会学到许多。为何是 underscore?最主要的原因是 underscore 简短精干(约 1.5k 行),封装了 100 多个有效的要领,耦合度低,异常合适逐一要领浏览,合适楼主如许的 JavaScript 初学者。从中,你不仅能够学到用 void 0 替代 undefined 防止 undefined 被重写等一些小技能 ,也能够学到变量范例推断、函数撙节&函数去抖等经常使用的要领,还能够学到许多浏览器兼容的 hack,更能够学到作者的团体设想思绪以及 API 设想的道理(向后兼容)。
以后楼主会写一系列的文章跟人人分享在源码浏览中进修到的学问。
underscore-1.8.3 源码全文诠释 https://github.com/hanzichi/underscore-analysis/blob/master/underscore-1.8.3-analysis.js
underscore-1.8.3 源码解读项目地点 https://github.com/hanzichi/underscore-analysis
迎接围观~ (如果有兴致,迎接 star & watch~)您的关注是楼主继承写作的动力
Why does void 0 replace undefined
说来惭愧,underscore 源码解读这个 Repo 放在 Github 都已 20 天没有更新了,要不是本日 “不小心” 注重到,我竟然都快忘了(是否是 lu 多了),所以今晚无论如何都要 lu 出第一篇(毕竟万事开头难)。相对于其他源码解读的文章,基础都邑从团体设想最先讲起,楼主以为 underscore 这个库有点特别,so 决议根据本身的思绪,从用 void 0 替代 undefined 提及。
underscore 源码没有涌现 undefined(注重,其实有涌现一处,是为 “undefined”,而不是 undefined),而用 void 0 替代之。为何要这么做?我们能够从两部分解读,其一是 undefined 那里不好了,你非得找个替代品?其二就是替代品为毛要找 void 0?
我们先看第一点,答案很简单,undefined 并非保存词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写。
var undefined = 10;
// undefined -- chrome
// 10 -- IE 8
alert(undefined);
事实上,undefined 在 ES5 中已是全局对象的一个只读(read-only)属性了,它不能被重写。但是在部分作用域中,照样能够被重写的。
(function() {
var undefined = 10;
// 10 -- chrome
alert(undefined);
})();
(function() {
undefined = 10;
// undefined -- chrome
alert(undefined);
})();
接下来思索第二个题目,为毛找的替代品是 void 0?
我们来看看 MDN 的诠释:
The void operator evaluates the given expression and then returns undefined.
意义是说 void 运算符能对给定的表达式举行求值,然后返回 undefined。也就是说,void 背面你随意跟上一个表达式,返回的都是 undefined,都能圆满替代 undefined!那末,这个中最短的是什么呢?毫无疑问就是 void 0 了。其有用 void 1,void (1+1),void (0) 或许 void “hello”,void (new Date()) 等等,都是一样的结果。更主要的条件是,void 是不能被重写的(cannot be overidden)。
那末,ES5 大环境下,void 0 就没有效武之地了吗?答案是否认的,用 void 0 替代 undefined 能节约不少字节的大小,事实上,不少 JavaScript 紧缩工具在紧缩过程当中,恰是将 undefined 用 void 0 替代掉了。
一篇不长的文章写了两个小时,心累,不点个赞、不关注下楼主的 Repo 你以为好意义吗?https://github.com/hanzichi/underscore-analysis