ES6 (ES2015)

参数

  • callbackFn 回调函数
    • item 元素
    • index 下标
    • arr 原数组
  • thisArg 回调函数this指向
    • 非严格模式默认为window ```javascript const arr = [1,2,3,4,5];

// 返回第一个满足条件的数组对应的元素下标 const idx = arr.findIndex(item => item > 2); // 2 const item = arr.find(item=> item > 2); // 3

// 没有找到符合条件的元素 返回 -1 const idx = arr.findIndex(item => item > 5); // -1

// 数组长度为空的情况返回-1 const idx = [].findIndex(item => item > 2); // -1

  1. <a name="7b4tM"></a>
  2. # 对于稀疏数组
  3. ```javascript
  4. [,2,,,,,,].findIndex(item => item === 2); // 1
  5. [,2,,,,,,].findIndex(item => {
  6. console.log(item);
  7. return item === 2;
  8. });
  9. /*
  10. undefined
  11. 2
  12. */
  1. 稀疏数组是正常遍历空隙
    1. ES5的遍历方法只会遍历有值的索引项
    2. 与find同理
  2. 空隙将会被填充为undefined
  3. findIndex如果回调返回true, 遍历就停止

行为表现

回调函数内部是无法改变元素值
可以增加元素,但遍历只会在源数组的length,行为与find相似
语雀内容

polyfill

也是与find相同,只是返回的值为索引值。

Array.prototype.myFindIndex = function (cb) {
  if(this === null){
    throw new TypeError(`"this" is null`);
  }

  if(typeof cb !== 'function'){
    throw new TypeError('Callback must be a function type');
  }

  var obj = Object(this),
      len = obj.length >>> 0,
      arg2 = arguments[1],
      step = 0;

  while(step<len){
    var value = obj[step];
    if(cb.apply(arg2, [value, step, obj])){
      return step;
    }

    step ++;
  }

  return -1;
}