国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

lodash源碼分析之baseFindIndex中的運算符優先級

Meathill / 870人閱讀

摘要:從表中可以看到,比較運算符的優先級為,而三元表達式條件運算符的優化級為,因此可以確定比較運算符的優先級要比三元表達式的要高,循環條件其實等價于第二種寫法。從上表中也可以看出前綴自增比比較運算符的優化級要高。

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

——北島《城門開》

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

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

作用與用法

baseFindIndex 是內部方法,其作用類似于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 是傳遞進來的函數,在 baseFindIndex 調用該函數,如果返回的結果為真值,則中止查找,返回索引。

運算符優先級

我們再往外看,看看 while 的循環條件:

fromRight ? index-- : ++index < length

現在問題來了,這個三元表達式有兩種可能,一種是:

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

一種是:

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

究竟是那一種呢?這就要看運算符的優化級了,下面這個表是 MDN 上的截圖:

這個表將優化級劃分成了20個級別,數字越大,優化級越高。

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

增減迷局

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

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

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

再結合循環條件看下:

fromRight ? index-- : ++index < length

在向前查找時,使用的是 index-- 表達式的運算結果,向后查找時,使用的是 ++index < lenth 表達式的運算結果。

從上表中也可以看出前綴自增比比較運算符的優化級要高。

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

同理,在向前查找時,需要將索引增加1,因為在遍歷開始時就已經將索引減少1。

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

因為在向前查找時,最終要查找到數組索引 0 的位置,后綴自減返回的是自減前的數值,因此當 index1 時,自減后的 index0 ,但是在循環條件中依然拿 1 來進行判斷,所以使得索引 0 得以進入循環體。

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

參考

MDN:運算符優先級

License

署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)

最后,所有文章都會同步發送到微信公眾號上,歡迎關注,歡迎提意見:

作者:對角另一面

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107254.html

相關文章

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

    摘要:接口設計同樣實現了跟一致的數據管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數根據來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙。——《至愛梵高·星空之謎》 本文為讀 lodash 源碼的第八篇,后續文章會更新到這個倉庫中,歡迎 star:pocket-...

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

    摘要:接口設計同樣實現了跟一致的數據管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數根據來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙。——《至愛梵高·星空之謎》 本文為讀 lodash 源碼的第八篇,后續文章會更新到這個倉庫中,歡迎 star:pocket-...

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

    摘要:依賴源碼分析之緩存使用方式的進一步封裝源碼分析之源碼分析之源碼分析之的實現源碼分析之源碼分析的調用如果有傳遞,則先調用,使用生成要比較數組的映射數組。循環完畢,沒有在第二個數組中發現相同的項時,將該項存入數組中。 外部世界那些破舊與貧困的樣子,可以使我內心世界得到平衡。——卡爾維諾《煙云》 本文為讀 lodash 源碼的第十七篇,后續文章會更新到這個倉庫中,歡迎 star:pocke...

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

    摘要:作用與用法是的內部函數,之前在源碼分析之緩存介紹過一種這樣的數據結構這是一個二維數組,每項中的第一項作為緩存對象的,第二項為緩存的值。 這個世界需要一個特定的惡人,可以供人們指名道姓,千夫所指:全都怪你。——村上春樹《當我談跑步時我談些什么》 本文為讀 lodash 源碼的第六篇,后續文章會更新到這個倉庫中,歡迎 star:pocket-lodash gitbook也會同步倉庫的更新...

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

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

    lijy91 評論0 收藏0

發表評論

0條評論

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