摘要:作用與用法是的內(nèi)部函數(shù),之前在源碼分析之緩存介紹過一種這樣的數(shù)據(jù)結構這是一個二維數(shù)組,每項中的第一項作為緩存對象的,第二項為緩存的值。
這個世界需要一個特定的惡人,可以供人們指名道姓,千夫所指:“全都怪你”。——村上春樹《當我談跑步時我談些什么》
本文為讀 lodash 源碼的第六篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-lodash
gitbook也會同步倉庫的更新,gitbook地址:pocket-lodash
本篇分析的是 assocIndexOf 函數(shù)。
作用與用法assocIndexOf 是 lodash 的內(nèi)部函數(shù),之前在《lodash源碼分析之Hash緩存》介紹過一種這樣的數(shù)據(jù)結構:
var caches = [["test1", 1],["test2",2],["test3",3]]
這是一個二維數(shù)組,每項中的第一項作為緩存對象的 key,第二項為緩存的值。
assocIndexOf 的作用是找出指定的 key 在數(shù)組中的索引值。
例如要找 key 為 tes1 的索引 :
assocIndexOf(caches, "test1") // 0依賴
import eq from "../eq.js"
lodash源碼分析之NaN不是NaN
源碼分析function assocIndexOf(array, key) { let { length } = array while (length--) { if (eq(array[length][0], key)) { return length } } return -1 }
這段代碼很精簡,讓 length 自減,調用 eq 函數(shù),從二維數(shù)組的最后一項開始,逐項獲取 key 值,與傳入的 key 比較,遇到匹配的,馬上將該項的索引返回。如果都沒找到,返回 -1 。返回結果的規(guī)則與 indexOf 一致。
length--和--length我們都知道自減還有另外一種前置的形式,即 --length,那將上面的代碼改成 while(--length) 可不可以呢?試一下就知道了。
改了之后,用 caches 來測試下:
assocIndexOf(caches, "test3") // 2 assocIndexOf(caches, "test2") // 1 assocIndexOf(caches, "test1") // -1
可以看到,改了之后,只影響到了第一項的結果,也就是終止條件有問題,根本沒有遍歷到第一項,但是后面的結果是正確的,也就說循環(huán)體里的 length 沒有受到影響。
你可能會有點疑惑,while 的終止條件比較的不是 length 嗎?為什么 length-- 正確,而 --length 不正確呢?
其實 while 的終止條件并不是 length ,而是 length-- 表達式所返回的結果?,F(xiàn)在來看一下 length-- 和 --length 所返回的結果有什么差別。
var length = 3 length-- // 3 length // 2
可以看到, length-- 返回的結果和自減前的一致,但是 length 已經(jīng)減少 1 了。因此使用 length-- ,最后一次進入循環(huán)體應該在 length 等于 1 的時候。
再來看 --length
var length = 3 --length // 2 length // 2
--length 返回的結果跟自減后的結果一致,因此最后一次進入循環(huán)體應該是 length 為 2 的時候,因此如果換成這種形式,會漏掉一次循環(huán)。
參考代碼之謎(二)- 語句與表達式
License署名-非商業(yè)性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)
最后,所有文章都會同步發(fā)送到微信公眾號上,歡迎關注,歡迎提意見:
作者:對角另一面
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/90768.html
摘要:從表中可以看到,比較運算符的優(yōu)先級為,而三元表達式條件運算符的優(yōu)化級為,因此可以確定比較運算符的優(yōu)先級要比三元表達式的要高,循環(huán)條件其實等價于第二種寫法。從上表中也可以看出前綴自增比比較運算符的優(yōu)化級要高。 我悟出權力本來就是不講理的——蟑螂就是海米;也悟出要造反,內(nèi)心必須強大到足以承受任何后果才行?!睄u《城門開》 本文為讀 lodash 源碼的第十篇,后續(xù)文章會更新到這個倉庫中...
摘要:在之前的文章中已經(jīng)介紹過,檢測的是對應的數(shù)組在二維數(shù)組中的索引,其行為跟一致,不存在于二維數(shù)組中時,返回,否則返回索引值。最后將緩存數(shù)量減少。 昨日我沿著河岸/漫步到/蘆葦彎腰喝水的地方順便請煙囪/在天空為我寫一封長長的信 潦是潦草了些/而我的心意/則明亮亦如你窗前的燭光/稍有曖昧之處/勢所難免/因為風的緣故 ——洛夫《因為風的緣故》 本文為讀 lodash 源碼的第七篇,后續(xù)文章會...
摘要:在之前的文章中已經(jīng)介紹過,檢測的是對應的數(shù)組在二維數(shù)組中的索引,其行為跟一致,不存在于二維數(shù)組中時,返回,否則返回索引值。最后將緩存數(shù)量減少。 昨日我沿著河岸/漫步到/蘆葦彎腰喝水的地方順便請煙囪/在天空為我寫一封長長的信 潦是潦草了些/而我的心意/則明亮亦如你窗前的燭光/稍有曖昧之處/勢所難免/因為風的緣故 ——洛夫《因為風的緣故》 本文為讀 lodash 源碼的第七篇,后續(xù)文章會...
摘要:接口設計同樣實現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數(shù)根據(jù)來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙?!吨翋坭蟾摺ば强罩i》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-...
摘要:接口設計同樣實現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數(shù)根據(jù)來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙?!吨翋坭蟾摺ば强罩i》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-...
閱讀 2054·2021-09-22 16:05
閱讀 9410·2021-09-22 15:03
閱讀 2910·2019-08-30 15:53
閱讀 1727·2019-08-29 11:15
閱讀 938·2019-08-26 13:52
閱讀 2379·2019-08-26 11:32
閱讀 1833·2019-08-26 10:38
閱讀 2598·2019-08-23 17:19