//实现reduce 方法 reduce对数组中的每个元素执行reduce中的回调函数,然后每次记录累加结果在第一个参数中,最终返回
// [1,2,4].reduce((pre,cur,idx,array)=>{},initVal) pre也是累加器。 一些边缘情况没考虑。比如 对于空数组的reduce,reduce会抛出错误!
Array.prototype.mockReduce =function(f,initVal){
// 对this暂时存储,方便下面语义化处理逻辑。
const array =this
// 先处理initVal和没有initVal的情况,其实就是
let pre = initVal || array[0]
// 再处理将要进行的for循环从哪个开始坐标开始 ,如果有初始值,数组中的第一位还没有被循环到,所以startIdx要从0开始,也把他带上
// 如果没有则,pre已经是数组的第一位了。
const startIdx = initVal ? 0 :1
for(let i = startIdx
const cur = array[i]
//执行内置函数,并将累加器参数记录下来。赋值给第一个参数,让其一直记录累加下去。
pre =f(pre,cur,i,array)
}
// 这第一参数也是累加器,也是返回的内容 (可能是任意的数据类型)
return pre
}
console.log([1,2,3].mockReduce((pre,cur) =>pre+cur,0))