摘要:從表中可以看到,比較運算符的優(yōu)先級為,而三元表達(dá)式條件運算符的優(yōu)化級為,因此可以確定比較運算符的優(yōu)先級要比三元表達(dá)式的要高,循環(huán)條件其實等價于第二種寫法。從上表中也可以看出前綴自增比比較運算符的優(yōu)化級要高。
我悟出權(quán)力本來就是不講理的——蟑螂就是海米;也悟出要造反,內(nèi)心必須強(qiáng)大到足以承受任何后果才行。——北島《城門開》
本文為讀 lodash 源碼的第十篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-lodash
gitbook也會同步倉庫的更新,gitbook地址:pocket-lodash
作用與用法baseFindIndex 是內(nèi)部方法,其作用類似于ES6的 findIndex,查找符合條件的第一個元素的索引。
baseFindIndex 除了從前向后查找外,還可以從后向前查找。
用法如下:
baseFindIndex([3,1,2], function(val, index, array) { return val > 1 }, 1) // 從前向后查找,從索引1開始查找,返回2 baseFindIndex([3,1,2], function(val, index, array) { return val > 1 }, 1, true) // 從后向前查找,從索引1開始查找,返回3源碼分析
function baseFindIndex(array, predicate, fromIndex, fromRight) { const { length } = array let index = fromIndex + (fromRight ? 1 : -1) while ((fromRight ? index-- : ++index < length)) { if (predicate(array[index], index, array)) { return index } } return -1 }
這段代碼再次展示了 lodash 的特點,短小精悍!
這次讀源碼我們從里往外看。
從代碼中很容易看到,predicate 是傳遞進(jìn)來的函數(shù),在 baseFindIndex 調(diào)用該函數(shù),如果返回的結(jié)果為真值,則中止查找,返回索引。
運算符優(yōu)先級我們再往外看,看看 while 的循環(huán)條件:
fromRight ? index-- : ++index < length
現(xiàn)在問題來了,這個三元表達(dá)式有兩種可能,一種是:
(fromRight ? index-- : ++index) < length
一種是:
fromRight ? index-- : (++index < length)
究竟是那一種呢?這就要看運算符的優(yōu)化級了,下面這個表是 MDN 上的截圖:
這個表將優(yōu)化級劃分成了20個級別,數(shù)字越大,優(yōu)化級越高。
從表中可以看到,比較運算符的優(yōu)先級為11,而三元表達(dá)式(條件運算符)的優(yōu)化級為4,因此可以確定比較運算符的優(yōu)先級要比三元表達(dá)式的要高,循環(huán)條件其實等價于第二種寫法。
增減迷局再往上看,可以看到這句代碼:
let index = fromIndex + (fromRight ? 1 : -1)
在向后查找時, index 減少了1,而向前查找時,index 增加了1,為什么要這樣做呢?
再結(jié)合循環(huán)條件看下:
fromRight ? index-- : ++index < length
在向前查找時,使用的是 index-- 表達(dá)式的運算結(jié)果,向后查找時,使用的是 ++index < lenth 表達(dá)式的運算結(jié)果。
從上表中也可以看出前綴自增比比較運算符的優(yōu)化級要高。
前綴自增返回的是自增后的結(jié)果,而在循環(huán)條件中就要將索引 index 增加1,這樣會忽略掉第一個需要遍歷的元素,作為補救,在開始遍歷前,需要將 index 減少1。
同理,在向前查找時,需要將索引增加1,因為在遍歷開始時就已經(jīng)將索引減少1。
那又為什么向前查找時用的是后綴自減,而不是用前綴自減呢?
因為在向前查找時,最終要查找到數(shù)組索引 0 的位置,后綴自減返回的是自減前的數(shù)值,因此當(dāng) index 為 1 時,自減后的 index 為 0 ,但是在循環(huán)條件中依然拿 1 來進(jìn)行判斷,所以使得索引 0 得以進(jìn)入循環(huán)體。
關(guān)于前綴自增/減和后綴自增/減的區(qū)別可以看《lodash源碼分析之自減的兩種形式》。
參考MDN:運算符優(yōu)先級
License署名-非商業(yè)性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)
最后,所有文章都會同步發(fā)送到微信公眾號上,歡迎關(guān)注,歡迎提意見:
作者:對角另一面
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107254.html
摘要:接口設(shè)計同樣實現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應(yīng)緩存方式的實例這個函數(shù)根據(jù)來獲取儲存了該的緩存實例。 每個人心里都有一團(tuán)火,路過的人只看到煙?!吨翋坭蟾摺ば强罩i》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-...
摘要:接口設(shè)計同樣實現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應(yīng)緩存方式的實例這個函數(shù)根據(jù)來獲取儲存了該的緩存實例。 每個人心里都有一團(tuán)火,路過的人只看到煙?!吨翋坭蟾摺ば强罩i》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-...
摘要:依賴源碼分析之緩存使用方式的進(jìn)一步封裝源碼分析之源碼分析之源碼分析之的實現(xiàn)源碼分析之源碼分析的調(diào)用如果有傳遞,則先調(diào)用,使用生成要比較數(shù)組的映射數(shù)組。循環(huán)完畢,沒有在第二個數(shù)組中發(fā)現(xiàn)相同的項時,將該項存入數(shù)組中。 外部世界那些破舊與貧困的樣子,可以使我內(nèi)心世界得到平衡?!柧S諾《煙云》 本文為讀 lodash 源碼的第十七篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocke...
摘要:作用與用法是的內(nèi)部函數(shù),之前在源碼分析之緩存介紹過一種這樣的數(shù)據(jù)結(jié)構(gòu)這是一個二維數(shù)組,每項中的第一項作為緩存對象的,第二項為緩存的值。 這個世界需要一個特定的惡人,可以供人們指名道姓,千夫所指:全都怪你。——村上春樹《當(dāng)我談跑步時我談些什么》 本文為讀 lodash 源碼的第六篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-lodash gitbook也會同步倉庫的更新...
摘要:例如其中的為,但是數(shù)組中沒有元素,是稀疏數(shù)組而每個位置都是有元素的,雖然每個元素都為,為密集數(shù)組。那稀疏數(shù)組和密集數(shù)組有什么區(qū)別呢在中最主要考慮的是兩者在迭代器中的表現(xiàn)。截取并返回新數(shù)組為新數(shù)組容器。 卑鄙是卑鄙者的通行證,高尚是高尚者的墓志銘。 ——北島《回答》 看北島就是從這兩句詩開始的,高尚者已死,只剩卑鄙者在世間橫行。 本文為讀 lodash 源碼的第一篇,后續(xù)文章會更新到...
閱讀 3888·2021-10-08 10:05
閱讀 2973·2021-09-27 13:57
閱讀 2696·2019-08-29 11:32
閱讀 1022·2019-08-28 18:18
閱讀 1315·2019-08-28 18:05
閱讀 1998·2019-08-26 13:39
閱讀 878·2019-08-26 11:37
閱讀 2059·2019-08-26 10:37