现如今的前端面试中,常常会考察候选人的编码能力。不仅会考察基本的数据结构与算法,还会考察javascript基本功,看候选人对js基础的理解和掌握程度。
面试官:请你简单实现一下数组方法reduce
要想实现一个东西,必须要懂这个东西是做什么用的。
reduce方法接收两个参数,第一个参数是一个回调函数,第二个参数是一个初始值。回调函数接收四个参数,分别为上一次调用回调函数后的返回值、当前处理的数组项、当前数组项的下标以及数组本身,分别对应下方的prev、curr、index和array。 reduce方法的第二个参数初始值不是必需参数,若传了初始值则prev值为传的初始值,若未传初始值则prev值为数组的第一项。
let arr = [1, 2, 3];
let res = arr.reduce((prev, curr, index, array) => {
return prev + curr;
})
// res = 6
懂了reduce是什么了之后,我们就可以用代码实现他啦~
第一步:把reduce方法挂载到Array构造函数的原型上来进行模拟
Array.prototype.myReduce = function () {
}
第二步:判断传的第一个参数是否为函数,若不是则抛出一个错误
Array.prototype.myReduce = function (fn, initValue) {
if (typeof fn !== 'function') {
throw new Error('parameter1 is not a function')
}
}
第三步:判断是否传了初始值并对数组进行遍历处理,最后返回结果。
这里我们定义了一个i,若传了初始值则数组遍历时我们从数组第一项开始遍历,若没传则从数组第二项开始遍历,因为数组第一项的值就是初始值。
Array.prototype.myReduce = function (fn, initValue) {
if (typeof fn !== 'function') {
throw new Error('parameter1 is not a function')
}
let i = 0;
if (typeof(initValue) === "undefined") {
i = 1;
initValue = this[0];
}
for (; i < this.length; i++) {
initValue = fn(initValue, this[i], i, this);
}
return initValue;
}