SOURCE

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 命令行工具 X clear

                    
>
console