返回

ES6 find和findIndex 详细源码解释及面试高频题巧妙解答

前端

揭秘find和findIndex函数的秘密:精妙源码解析和巧妙面试题解答

在JavaScript的众多强大功能中,find和findIndex函数脱颖而出,为数组操作带来了极大的便利。掌握这两个函数的奥秘不仅能提高代码效率,还能助你应对面试中的挑战。本文将深入解析find和findIndex函数的源码,并通过巧妙的面试题解答,带你领略它们的精妙之处。

find函数:从数组中精准定位

1. 源码解读

Array.prototype.find = function(callbackfn, thisArg) {
  if (this === null) {
    throw new TypeError('this is null or not defined');
  }
  var O = Object(this);
  var len = O.length >>> 0;
  if (typeof callbackfn !== 'function') {
    throw new TypeError('callbackfn is not a function');
  }
  for (var k = 0; k < len; k++) {
    var kValue = O[k];
    if (callbackfn.call(thisArg, kValue, k, O)) {
      return kValue;
    }
  }
  return undefined;
};

find函数以一个回调函数为参数,遍历数组中的每个元素,一旦回调函数返回true,便立即返回该元素。值得注意的是,回调函数可以接收三个参数:当前元素、元素索引以及数组本身。

2. 巧妙面试题解答

面试题:给定数组arr = [1, 2, 3, 4, 5],找到第一个大于3的元素。

const arr = [1, 2, 3, 4, 5];
const result = arr.find(element => element > 3);
console.log(result); // 输出:4

findIndex函数:定位元素索引的利器

1. 源码解读

Array.prototype.findIndex = function(callbackfn, thisArg) {
  if (this === null) {
    throw new TypeError('this is null or not defined');
  }
  var O = Object(this);
  var len = O.length >>> 0;
  if (typeof callbackfn !== 'function') {
    throw new TypeError('callbackfn is not a function');
  }
  for (var k = 0; k < len; k++) {
    var kValue = O[k];
    if (callbackfn.call(thisArg, kValue, k, O)) {
      return k;
    }
  }
  return -1;
};

findIndex函数与find函数类似,但它不返回元素本身,而是返回满足回调函数条件的第一个元素的索引。

2. 巧妙面试题解答

面试题:给定数组arr = [1, 2, 3, 4, 5],找到第一个大于3的元素的下标。

const arr = [1, 2, 3, 4, 5];
const result = arr.findIndex(element => element > 3);
console.log(result); // 输出:3

find和findIndex的精妙应用

find和findIndex函数在实际开发中有着广泛的应用场景:

  • 从大型数组中查找特定元素
  • 验证数组中是否存在满足特定条件的元素
  • 获取满足条件元素的索引
  • 移除不满足条件的元素
  • 根据条件对数组进行分组或排序

常见问题解答

  1. find和findIndex函数会修改原始数组吗?

    否,它们都是不可变方法,不会修改原始数组。

  2. 回调函数的this参数是什么?

    回调函数的this参数指向调用find或findIndex的数组。

  3. 如果回调函数始终返回false,find和findIndex函数会做什么?

    它们将返回undefined(对于find)或-1(对于findIndex)。

  4. find和findIndex函数的时间复杂度是多少?

    最坏情况下为O(n),其中n是数组的长度。

  5. find和findIndex函数有什么区别?

    find函数返回满足条件的第一个元素,而findIndex函数返回满足条件的第一个元素的索引。