ES6 find和findIndex 详细源码解释及面试高频题巧妙解答
2023-09-21 11:41:30
揭秘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函数在实际开发中有着广泛的应用场景:
- 从大型数组中查找特定元素
- 验证数组中是否存在满足特定条件的元素
- 获取满足条件元素的索引
- 移除不满足条件的元素
- 根据条件对数组进行分组或排序
常见问题解答
-
find和findIndex函数会修改原始数组吗?
否,它们都是不可变方法,不会修改原始数组。
-
回调函数的this参数是什么?
回调函数的this参数指向调用find或findIndex的数组。
-
如果回调函数始终返回false,find和findIndex函数会做什么?
它们将返回undefined(对于find)或-1(对于findIndex)。
-
find和findIndex函数的时间复杂度是多少?
最坏情况下为O(n),其中n是数组的长度。
-
find和findIndex函数有什么区别?
find函数返回满足条件的第一个元素,而findIndex函数返回满足条件的第一个元素的索引。