亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

lodash源碼分析之baseFindIndex中的運(yùn)算符優(yōu)先級

Meathill / 951人閱讀

摘要:從表中可以看到,比較運(yùn)算符的優(yōu)先級為,而三元表達(dá)式條件運(yùn)算符的優(yōu)化級為,因此可以確定比較運(yùn)算符的優(yōu)先級要比三元表達(dá)式的要高,循環(huán)條件其實(shí)等價(jià)于第二種寫法。從上表中也可以看出前綴自增比比較運(yùn)算符的優(yōu)化級要高。

我悟出權(quán)力本來就是不講理的——蟑螂就是海米;也悟出要造反,內(nèi)心必須強(qiáng)大到足以承受任何后果才行。

——北島《城門開》

本文為讀 lodash 源碼的第十篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star:pocket-lodash

gitbook也會同步倉庫的更新,gitbook地址:pocket-lodash

作用與用法

baseFindIndex 是內(nèi)部方法,其作用類似于ES6的 findIndex,查找符合條件的第一個(gè)元素的索引。

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 的特點(diǎn),短小精悍!

這次讀源碼我們從里往外看。

從代碼中很容易看到,predicate 是傳遞進(jìn)來的函數(shù),在 baseFindIndex 調(diào)用該函數(shù),如果返回的結(jié)果為真值,則中止查找,返回索引。

運(yùn)算符優(yōu)先級

我們再往外看,看看 while 的循環(huán)條件:

fromRight ? index-- : ++index < length

現(xiàn)在問題來了,這個(gè)三元表達(dá)式有兩種可能,一種是:

(fromRight ? index-- : ++index) < length

一種是:

fromRight ? index-- : (++index < length)

究竟是那一種呢?這就要看運(yùn)算符的優(yōu)化級了,下面這個(gè)表是 MDN 上的截圖:

這個(gè)表將優(yōu)化級劃分成了20個(gè)級別,數(shù)字越大,優(yōu)化級越高。

從表中可以看到,比較運(yùn)算符的優(yōu)先級為11,而三元表達(dá)式(條件運(yùn)算符)的優(yōu)化級為4,因此可以確定比較運(yùn)算符的優(yōu)先級要比三元表達(dá)式的要高,循環(huán)條件其實(shí)等價(jià)于第二種寫法。

增減迷局

再往上看,可以看到這句代碼:

let index = fromIndex + (fromRight ? 1 : -1)

在向后查找時(shí), index 減少了1,而向前查找時(shí),index 增加了1,為什么要這樣做呢?

再結(jié)合循環(huán)條件看下:

fromRight ? index-- : ++index < length

在向前查找時(shí),使用的是 index-- 表達(dá)式的運(yùn)算結(jié)果,向后查找時(shí),使用的是 ++index < lenth 表達(dá)式的運(yùn)算結(jié)果。

從上表中也可以看出前綴自增比比較運(yùn)算符的優(yōu)化級要高。

前綴自增返回的是自增后的結(jié)果,而在循環(huán)條件中就要將索引 index 增加1,這樣會忽略掉第一個(gè)需要遍歷的元素,作為補(bǔ)救,在開始遍歷前,需要將 index 減少1。

同理,在向前查找時(shí),需要將索引增加1,因?yàn)樵诒闅v開始時(shí)就已經(jīng)將索引減少1。

那又為什么向前查找時(shí)用的是后綴自減,而不是用前綴自減呢?

因?yàn)樵谙蚯安檎視r(shí),最終要查找到數(shù)組索引 0 的位置,后綴自減返回的是自減前的數(shù)值,因此當(dāng) index1 時(shí),自減后的 index0 ,但是在循環(huán)條件中依然拿 1 來進(jìn)行判斷,所以使得索引 0 得以進(jìn)入循環(huán)體。

關(guān)于前綴自增/減和后綴自增/減的區(qū)別可以看《lodash源碼分析之自減的兩種形式》。

參考

MDN:運(yùn)算符優(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://www.ezyhdfw.cn/yun/107254.html

相關(guān)文章

  • lodash源碼分析緩存方式的選擇

    摘要:接口設(shè)計(jì)同樣實(shí)現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個(gè)函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應(yīng)緩存方式的實(shí)例這個(gè)函數(shù)根據(jù)來獲取儲存了該的緩存實(shí)例。 每個(gè)人心里都有一團(tuán)火,路過的人只看到煙?!吨翋坭蟾摺ば强罩i》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star:pocket-...

    HitenDev 評論0 收藏0
  • lodash源碼分析緩存方式的選擇

    摘要:接口設(shè)計(jì)同樣實(shí)現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個(gè)函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應(yīng)緩存方式的實(shí)例這個(gè)函數(shù)根據(jù)來獲取儲存了該的緩存實(shí)例。 每個(gè)人心里都有一團(tuán)火,路過的人只看到煙?!吨翋坭蟾摺ば强罩i》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star:pocket-...

    AdolphLWQ 評論0 收藏0
  • lodash源碼分析數(shù)組的差集

    摘要:依賴源碼分析之緩存使用方式的進(jìn)一步封裝源碼分析之源碼分析之源碼分析之的實(shí)現(xiàn)源碼分析之源碼分析的調(diào)用如果有傳遞,則先調(diào)用,使用生成要比較數(shù)組的映射數(shù)組。循環(huán)完畢,沒有在第二個(gè)數(shù)組中發(fā)現(xiàn)相同的項(xiàng)時(shí),將該項(xiàng)存入數(shù)組中。 外部世界那些破舊與貧困的樣子,可以使我內(nèi)心世界得到平衡?!柧S諾《煙云》 本文為讀 lodash 源碼的第十七篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star:pocke...

    Noodles 評論0 收藏0
  • lodash源碼分析自減的兩種形式

    摘要:作用與用法是的內(nèi)部函數(shù),之前在源碼分析之緩存介紹過一種這樣的數(shù)據(jù)結(jié)構(gòu)這是一個(gè)二維數(shù)組,每項(xiàng)中的第一項(xiàng)作為緩存對象的,第二項(xiàng)為緩存的值。 這個(gè)世界需要一個(gè)特定的惡人,可以供人們指名道姓,千夫所指:全都怪你?!迳洗簶洹懂?dāng)我談跑步時(shí)我談些什么》 本文為讀 lodash 源碼的第六篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star:pocket-lodash gitbook也會同步倉庫的更新...

    Keven 評論0 收藏0
  • lodash源碼從slice看稀疏數(shù)組與密集數(shù)組

    摘要:例如其中的為,但是數(shù)組中沒有元素,是稀疏數(shù)組而每個(gè)位置都是有元素的,雖然每個(gè)元素都為,為密集數(shù)組。那稀疏數(shù)組和密集數(shù)組有什么區(qū)別呢在中最主要考慮的是兩者在迭代器中的表現(xiàn)。截取并返回新數(shù)組為新數(shù)組容器。 卑鄙是卑鄙者的通行證,高尚是高尚者的墓志銘。 ——北島《回答》 看北島就是從這兩句詩開始的,高尚者已死,只剩卑鄙者在世間橫行。 本文為讀 lodash 源碼的第一篇,后續(xù)文章會更新到...

    lijy91 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<