Why underscore
最近開(kāi)始看 underscore源碼,并將 underscore源碼解讀 放在了我的2016計(jì)劃中。
閱讀一些著名框架類(lèi)庫(kù)的源碼,就好像和一個(gè)個(gè)大師對(duì)話,你會(huì)學(xué)到很多。為什么是 underscore?最主要的原因是 underscore 簡(jiǎn)短精悍(約 1.5k 行),封裝了 100 多個(gè)有用的方法,耦合度低,非常適合逐個(gè)方法閱讀,適合樓主這樣的 JavaScript 初學(xué)者。從中,你不僅可以學(xué)到用 void 0 代替 undefined 避免 undefined 被重寫(xiě)等一些小技巧 ,也可以學(xué)到變量類(lèi)型判斷、函數(shù)節(jié)流&函數(shù)去抖等常用的方法,還可以學(xué)到很多瀏覽器兼容的 hack,更可以學(xué)到作者的整體設(shè)計(jì)思路以及 API 設(shè)計(jì)的原理(向后兼容)。
之后樓主會(huì)寫(xiě)一系列的文章跟大家分享在源碼閱讀中學(xué)習(xí)到的知識(shí)。
- underscore-1.8.3 源碼全文注釋 https://github.com/hanzichi/underscore-analysis/blob/master/underscore-1.8.3.js/underscore-1.8.3-analysis.js
- underscore-1.8.3 源碼解讀項(xiàng)目地 https://github.com/hanzichi/underscore-analysis
歡迎圍觀~ (如果有興趣,歡迎 star & watch~)您的關(guān)注是樓主繼續(xù)寫(xiě)作的動(dòng)力
Why does void 0 replace undefined
說(shuō)來(lái)慚愧,underscore 源碼解讀這個(gè) Repo 放在 Github 都已經(jīng) 20 天沒(méi)有更新了,要不是今天 "不小心" 注意到,我居然都快忘了(是不是 lu 多了),所以今晚無(wú)論如何都要 lu 出第一篇(畢竟萬(wàn)事開(kāi)頭難)。相對(duì)于其他源碼解讀的文章,基本都會(huì)從整體設(shè)計(jì)開(kāi)始講起,樓主覺(jué)得 underscore 這個(gè)庫(kù)有點(diǎn)特殊,so 決定按照自己的思路,從用 void 0 代替 undefined 說(shuō)起。
underscore 源碼沒(méi)有出現(xiàn) undefined(注意,其實(shí)有出現(xiàn)一處,是為 "undefined",而不是 undefined),而用 void 0 代替之。為什么要這么做?我們可以從兩部分解讀,其一是 undefined 哪里不好了,你非得找個(gè)替代品?其二就是替代品為毛要找 void 0?
我們先看第一點(diǎn),答案很簡(jiǎn)單,undefined 并不是保留詞(reserved word),它只是全局對(duì)象的一個(gè)屬性,在低版本 IE 中能被重寫(xiě)。
var undefined = 10;
// undefined -- chrome
// 10 -- IE 8
alert(undefined);
事實(shí)上,undefined 在 ES5 中已經(jīng)是全局對(duì)象的一個(gè)只讀(read-only)屬性了,它不能被重寫(xiě)。但是在局部作用域中,還是可以被重寫(xiě)的。
(function() {
var undefined = 10;
// 10 -- chrome
alert(undefined);
})();
(function() {
undefined = 10;
// undefined -- chrome
alert(undefined);
})();
接下來(lái)思考第二個(gè)問(wèn)題,為毛找的替代品是 void 0?
我們來(lái)看看 MDN 的解釋:
The void operator evaluates the given expression and then returns undefined.
意思是說(shuō) void 運(yùn)算符能對(duì)給定的表達(dá)式進(jìn)行求值,然后返回 undefined。也就是說(shuō),void 后面你隨便跟上一個(gè)表達(dá)式,返回的都是 undefined,都能完美代替 undefined!那么,這其中最短的是什么呢?毫無(wú)疑問(wèn)就是 void 0 了。其實(shí)用 void 1,void (1+1),void (0) 或者 void "hello",void (new Date()) 等等,都是一樣的效果。更重要的前提是,void 是不能被重寫(xiě)的(cannot be overidden)。
那么,ES5 大環(huán)境下,void 0 就沒(méi)有用武之地了嗎?答案是否定的,用 void 0 代替 undefined 能節(jié)省不少字節(jié)的大小,事實(shí)上,不少 JavaScript 壓縮工具在壓縮過(guò)程中,正是將 undefined 用 void 0 代替掉了。
一篇不長(zhǎng)的文章寫(xiě)了兩個(gè)小時(shí),心累,不點(diǎn)個(gè)贊、不關(guān)注下樓主的 Repo 你覺(jué)得好意思嗎?https://github.com/hanzichi/underscore-analysis