越看越菜系列


用法:根据fromIndex向左或者向右查找符合条件的第一个元素的索引。

function baseFindIndex(array, predicate, fromIndex, fromRight) 
  1. array 指输入的待查找数组
  2. predicate 指的是查找条件,是一个函数
  3. fromIndex 查找的起始点
  4. fromRight 为true时,从右向左查找; 为false或者不填的时候从左向右查找。

源码分析 :

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
}

先嘀咕一句,这代码也太好看了吧,都快有我家小骄傲3/4可爱了。


  1. 其中的 fromRight ? index-- : ++index < length 可以解析为 fromRight ? ( index-- ): ( ++index )< length
    为啥这样? js 基础再来回顾一下:运算符汇总表


  1. ++index index-- 以及 let index = fromIndex + (fromRight ? 1 : -1) 都是为啥呢?

  • array 的 index 范围是 0 - length - 1 。 也即,index === 0 时,循环应继续 , 故实际循环次数为 fromIndex + 1 , index-- (不妨举例为3) 变化顺序为 4,3,2,1 四次,从 3 + 1开始也正是上面标注的第二句的用途。
  • 若为从左往右,此时 实际循环次数为 length - fromIndex 。不妨举例 length 为 5 ,此时 " ++ index"变换顺序为 2 , 3 , 4, let index = fromIndex + (fromRight ? 1 : -1) 使得 fromIndex 从 2 开始