MDN文档中关于Array.proptotype.reduce的描述如下所示
如果数组为空并且没有提供initialValue,会抛出TypeError。如果数组仅有一个元素(无论位置如何)并且没有提供initialValue,或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行
[1].reduce(Math.pow) // 1
[10].reduce(Math.pow) // 10
[1,2,3].reduce(Math.pow) // 1,从左到右执行,分别是Math.pow(1,2),得到的结果为1,再Math.pow(1,3)
[1,2,3].reduceRight(Math.pow) // 9,从右到左执行,分别是Math.pow(3,2),得到的结果为9,再Math.pow(9,1)
用es5实现reduce方法
Array.prototype.reduceList = function(fn, sum) {
if (typeof fn !== 'function') {
throw new Error(`${fn} is not a function`)
}
if (typeof sum === 'undefined') sum = this[0]
for (let i = 1, len = this.length; i < len; i++) {
sum = fn(sum, this[i], i, this);
}
return sum;
}
用es5实现reduceRight方法
Array.prototype.reduceListRight = function(fn,sum){
if(typeof fn !== 'function'){
throw new Error(`${fn} is not a function`);
}
let index;
if(typeof sum === 'undefined'){
sum = this[this.length - 1];
index = this.length - 2;
}else{
index = this.length - 1;
}
for(var i = index;i >= 0; i--){
sum = fn(sum,this[i],i,this);
}
return sum;
}