摘要:最近開始看源碼,并將源碼解讀放在了我的計劃中。相對于其他源碼解讀的文章,基本都會從整體設計開始講起,樓主覺得這個庫有點特殊,決定按照自己的思路,從用代替說起。源碼沒有出現注意,其實有出現一處,是為,而不是,而用代替之。
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
Read Morevoid MDN
What does void 0 mean?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79472.html
摘要:你們說能不能就用的開發模式來實現客戶端啊這樣版版版就都有了。有道云筆記可能就是最貼近我們想法的產品,有客戶端,有版。這個項目由發起和維護。 最近一個多月一直在用 AngularJS 做公司的一個項目(還沒有做完),我之前主要是用 PHP 開發服務端的,AngularJS 也是現學現賣,整個過程還是比較有意義的,覺得很有必要寫篇文章記錄一下。 緣起 事情是這樣的……我們團隊的產品是一款 ...
摘要:你們說能不能就用的開發模式來實現客戶端啊這樣版版版就都有了。有道云筆記可能就是最貼近我們想法的產品,有客戶端,有版。這個項目由發起和維護。 最近一個多月一直在用 AngularJS 做公司的一個項目(還沒有做完),我之前主要是用 PHP 開發服務端的,AngularJS 也是現學現賣,整個過程還是比較有意義的,覺得很有必要寫篇文章記錄一下。 緣起 事情是這樣的……我們團隊的產品是一款 ...
摘要:在閱讀一些框架源碼時,發現都是用的代替,簡單的了一下運算符運算符對給定的表達式進行求值,然后返回。在之前,給賦值會覆蓋該屬性。但是由于不是保留字,依然可以在局部作用域中聲明一個的變量,并改變它的值。 在閱讀一些框架源碼時,發現都是用的 void 0 代替 undefined,簡單的 Google 了一下: void 運算符 void 運算符 對給定的表達式進行求值,然后返回 undef...
摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個問題中提到用去替代標簽的空屬性會減少頁面請求是否屬實有待考證結尾第一篇暫時寫完了,歡迎大家吐槽和提意見。 前言 原文鏈接 源碼地址 這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實主要有兩點 下劃線源碼中通篇可見這樣的判斷...
閱讀 3639·2021-11-24 09:38
閱讀 3142·2021-11-15 11:37
閱讀 781·2021-11-12 10:36
閱讀 3547·2021-10-21 09:38
閱讀 3220·2021-09-28 09:36
閱讀 2420·2021-09-22 16:01
閱讀 4986·2021-09-22 15:09
閱讀 1210·2019-08-30 15:55