手写常用的数组方法是面试中的常考题目,同时学会这些API的原理也能更好的帮助我们去理解这些API并加运用,下面让我们来一起手写reduce吧~
原生的reduce是在Array的原型对象上的一个方法,其接收两个参数:
Array.prototype.myReduce = function (fn, initialValue) {
var arr = Array.prototype.slice.call(this);
var res, startIndex;
res = initialValue ? initialValue : arr[0]; // 不传默认取数组第一项
startIndex = initialValue ? 0 : 1;
for (var i = startIndex; i < arr.length; i++) {
// 把初始值、当前值、索引、当前数组返回去。调用的时候传到函数参数中 [1,2,3,4].reduce((initVal,curr,index,arr))
res = fn.call(null, res, arr[i]);
}
return res;
}
const test = [1,2,3];
console.log(test.myReduce((pre,cur) => pre + cur));
手写原生的reduce这个题目,需要用到原生的slice方法,需要用到call,需要知道this指向的是谁,同时我们要对是否传入初始者进行判断,如果传入初始值,起始索引和初始值都是从第一项开始的,如果没有传入res则表示数组的第一项,起始索引则从第二项开始。