在深入了解js中的reduce这个函数中遇到不少问题,在MDN练习了使用场景之后,在手写实现方面看到一些文章不是很通俗易懂,后来在b站https://www.bilibili.com/video/BV1Q5411E7bb?t=652
这个老师的视频中对于手写实现有了一定的心得体会,以此记录;
let a = [[1,2],[3,4],5]
a.reduce((pre,cur,index,arr)=>{},object)
首先,原生的reduce参数分为两部分,第一部分为回调函数,及(pre,cur,index,arr)=>{} ,第二部分则为传入的参数,及object,之所以直接写为object,是因为它不仅仅可以是个数字,也能是个数组,对象,字符串。
其中最重要的无疑是pre,
首先,在没有传入object时,pre为传入数组的第一项,其次在回调函数callback中,它为上次执行的返回值,并且也是函数的最终返回值,这是个必须值(形参),
cur为pre的下一项,如果没有传入object它为传入数组第二项,反之则是第一项(必须项),
index为cur的下标(非必需),
arr为传入数组(非必需),
object(非必需),传入后默认为第一项;
//直接定义到原型链上
Array.prototype.myreduce = function (callback, n) {
//检测传入的callback是否为函数
if (typeof (callback) != 'function') {
return 'callback must be function'
}
let arr = this;
//this为传入数组,先持久化,方便后续使用
let pre = arguments.length == 1 ? arr[0] : n;
//*** 重点,初始pre的定义,如果arguments长度为一,则没有默认值pre初始值就是 this[0],及arr[0],反之,则为传入的值
let index = arguments.length == 1 ? 1 : 0;
// 这个则是初始index的值,也是分情况看待
for (let i = index; i < arr.length; i++){
pre = callback(pre, arr[i], i, arr)
//pre的值为上次callback的返回值
}
return pre;
}
结束。