Array.prototype.reduce = function (callback, initialValue) {
// 异常处理,和map一样
// 处理数组类型异常
if (this === null || this === undefined) {
throw new TypeError('Cannot read preperty "reduce" of null or undefined')
}
// 处理回调类型异常
if (Object.prototype.toString.call(callback) != '[object Function]') {
throw new TypeError(callback + 'is not a fuction')
}
let O = Object(this)
let len = O.length >>> 0
let k = 0
let accumulator = initialValue
if (accumulator === undefined) {
for (; k < len; k++) {
// 查找原型链
if (k in O) {
accumulator = O[k]
k++
break
}
}
// 循环结束还没退出,表示数组全为空
throw new Error('Each element of the array is empty')
}
for (; k < len; k++) {
if (k in O) {
accumulator = callback.call(undefined, accumulator, O[k], O)
}
}
return accumulator
}
const a = [1, 2, 3]
a.reduce((per, cur, index) => {
console.log(per, cur, index)
}, [])
console