摘要:但是在類中,要初始化緩存和設置緩存都需要提供和組成的二維數組,因此在類中,提供了一種更方便的緩存設置方式,只需要提供緩存的值即可。這里構造函數不需要再傳入的二維數組了,只需要傳入包含所有緩存值的數組即可。
在世界上所有的民族之中,支配著他們的喜怒選擇的并不是天性,而是他們的觀點。——盧梭《社會與契約論》
本文為讀 lodash 源碼的第九篇,后續文章會更新到這個倉庫中,歡迎 star:pocket-lodash
gitbook也會同步倉庫的更新,gitbook地址:pocket-lodash
前言在之前的《lodash源碼分析之Hash緩存》和《lodash源碼分析之List緩存》介紹過 lodash 的兩種緩存方式,在《lodash源碼分析之緩存方式的選擇》中介紹過這兩種緩存方式和 Map 的封裝,lodash 會根據緩存類型來選擇最優的緩存方式。
但是在 MapCache 類中,要初始化緩存和設置緩存都需要提供 key 和 value 組成的二維數組,因此在 SetCache 類中,lodash 提供了一種更方便的緩存設置方式,只需要提供緩存的值即可。
依賴import MapCache from "./MapCache.js"
lodash源碼分析之緩存方式的選擇
源碼分析const HASH_UNDEFINED = "__lodash_hash_undefined__" class SetCache { constructor(values) { let index = -1 const length = values == null ? 0 : values.length this.__data__ = new MapCache while (++index < length) { this.add(values[index]) } } add(value) { this.__data__.set(value, HASH_UNDEFINED) return this } has(value) { return this.__data__.has(value) } } SetCache.prototype.push = SetCache.prototype.add總體思路
從源碼中可以看到,SetCache 其實調用的是 MapCache 類,使用緩存的值作為 key ,所有的 key 對應的值都是 lodash 定義的標準 undefined 值 HASH_UNDEFINED ,正如之前文章中論述過的,這個值用于 Hash 緩存時,避免判斷是緩存是否存在時出錯。
判斷緩存是否存在,只需要判斷 MapCache 是否存在對應的 key 。
constructorconstructor(values) { let index = -1 const length = values == null ? 0 : values.length this.__data__ = new MapCache while (++index < length) { this.add(values[index]) } }
這里構造函數不需要再傳入 key-value 的二維數組了,只需要傳入包含所有緩存值的數組即可。
__data__ 屬性保存的其實是 MapCache 的實例。
初始化時只需要遍歷需要緩存的數組 values ,然后調用 add 方法,設置緩存即可。
addadd(value) { this.__data__.set(value, HASH_UNDEFINED) return this }
add 方法用來設置緩存。
其實調用的是 MapCahce 實例的 set 方法,使用緩存值 value 作為 key ,用 HASH_UNDEFINED 作為緩存值。
### has
has(value) { return this.__data__.has(value) }
has 方法用于判斷緩存是否存在。
只需要調用 MapCache 實例的 has 方法即可。
pushSetCache.prototype.push = SetCache.prototype.add
push 方法只是 add 方法的別名。
License署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)
最后,所有文章都會同步發送到微信公眾號上,歡迎關注,歡迎提意見:
作者:對角另一面
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107028.html
摘要:但是在類中,要初始化緩存和設置緩存都需要提供和組成的二維數組,因此在類中,提供了一種更方便的緩存設置方式,只需要提供緩存的值即可。這里構造函數不需要再傳入的二維數組了,只需要傳入包含所有緩存值的數組即可。 在世界上所有的民族之中,支配著他們的喜怒選擇的并不是天性,而是他們的觀點。——盧梭《社會與契約論》 本文為讀 lodash 源碼的第九篇,后續文章會更新到這個倉庫中,歡迎 star...
摘要:依賴源碼分析之緩存使用方式的進一步封裝源碼分析之源碼分析之源碼分析之的實現源碼分析之源碼分析的調用如果有傳遞,則先調用,使用生成要比較數組的映射數組。循環完畢,沒有在第二個數組中發現相同的項時,將該項存入數組中。 外部世界那些破舊與貧困的樣子,可以使我內心世界得到平衡。——卡爾維諾《煙云》 本文為讀 lodash 源碼的第十七篇,后續文章會更新到這個倉庫中,歡迎 star:pocke...
摘要:接口設計同樣實現了跟一致的數據管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數根據來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙。——《至愛梵高·星空之謎》 本文為讀 lodash 源碼的第八篇,后續文章會更新到這個倉庫中,歡迎 star:pocket-...
摘要:接口設計同樣實現了跟一致的數據管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數根據來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙。——《至愛梵高·星空之謎》 本文為讀 lodash 源碼的第八篇,后續文章會更新到這個倉庫中,歡迎 star:pocket-...
摘要:只接收一個二維數組作為參數,調用方式如下其中子項中的第一項會作為,第二項是需要緩存的值。實例化的結果如下緩存的數量儲存在的對象中。的作用是清空緩存,因此需要將重置為。將緩存的數據設置為空對象。因為在緩存中是以來表示的,因此遇到值為時,返回。 在那小小的夢的暖閣,我為你收藏起整個季節的煙雨。——洛夫《靈河》 本文為讀 lodash 源碼的第四篇,后續文章會更新到這個倉庫中,歡迎 sta...
閱讀 2835·2023-04-25 20:06
閱讀 1451·2021-08-26 14:15
閱讀 2241·2021-08-12 13:27
閱讀 1777·2019-08-30 15:55
閱讀 3479·2019-08-30 13:20
閱讀 2832·2019-08-29 15:12
閱讀 3336·2019-08-29 15:06
閱讀 2866·2019-08-29 14:13