lodashソース分析のbaseFindIndexの演算子優先度


権力は本来理不尽だと悟った.ゴキブリは海米だ.また、謀反を悟りました.心の中は何でも耐えられるほど強くならなければなりません.
——北島「城門開き」
本文はlodashのソースコードの第10編を読むために、後続の文章はこの倉庫に更新されます.スターを歓迎します.
git bookも同時に倉庫の更新ができます.gitbookアドレス:pocket-lodash
役割と使い方baseFindIndexは、条件に合致する第1の要素のインデックスを検索するためのES 6の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
問題が来ました.この3元表現は2つの可能性があります.
(fromRight ? index-- : ++index) < length
一つは:
fromRight ? index-- : (++index < length)
どれですか?これは演算子の最適化レベルを見ます.以下の表はMDN上のスクリーンショットです.
この表は最適化レベルを20段階に分けています.数字が大きいほど、最適化レベルが高いです.
表から見ると、比較演算子の優先度は11であり、3元式(条件演算子)の最適化レベルは4であるため、比較演算子の優先度は3元式より高くなり、循環条件は2番目の表記に等しいと判断できる.
増減パズル
上を見ると、このコードが見えます.
let index = fromIndex + (fromRight ? 1 : -1)
後方検索では、indexは1が減少し、前方検索ではindexは1が増加しました.なぜこのようにしますか?
循環条件を結合してみます.
fromRight ? index-- : ++index < length
前方検索ではindex--式の演算結果を用い、後方検索では++index < lenth式の演算結果を用いた.
上の表からも、プレフィックスの自己増加比が演算子の最適化レベルよりも高いことが分かります.
プレフィックスは増加から戻ってくるのは自己増加の結果であり、サイクリック条件でインデックスindexを1増加させるので、最初のトラバースを必要とする要素を無視して補完として、トラバース開始前にindexを1減少させる必要がある.
同じように、前の検索ではインデックスを1つ追加する必要があります.
どうして前へ検索する時は、接頭語で自滅するのではなく、接尾語で自滅するのですか?
前へ検索すると、最終的には配列インデックス0の位置が検索され、後は減算される前の値が返されるので、index1であるときには、減算されたindex0であるが、ループ条件では1で判断されるので、インデックス0は循環体に入ることができる.
プレフィックスの自増/減と後綴りの自増/減の違いについては、「lodashソース分析の自減の2つの形式」を見ることができます.
参照
  • MDN:演算子優先度
  • License
    署名-非商業的使用-演繹禁止4.0国際(CC BY-NC-ND 4.0)
    最後に、すべての文章が同時にWeChat公衆番号に送られます.ご注目ください.ご意見をどうぞ.
    対角線の反対側