// 实现一个 add 方法 使输出结果能够满足如下预期
add(1)(2)(3) = 6
add(1,2,3)(4) = 10
add(1)(2)(3)(4)(5) = 15
function add(){
// 第一次执行,定义一个数组专门用来存储所有的函数
var _args = Array.prototype.slice.call(...arguments)
// 在内部声明一个函数,利用闭包的特性保存 _args 并收集所有的参数值
var _adder = function() {
_args.push(...arguments);
return _adder
}
// 利用 toString 隐式转换的特性,当最后执行时隐式转换,并计算最终值返回
__adder.toString = function(){
return _args.reduce(function(a,b){
return a + b
})
}
return adder
}
add(1)(2)(3)
add(1,2,3)(4)
add(1)(2)(3)(4)(5)
Array.prototype.reduce()
reduce() 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行), 将其结果汇总为单个返回值。
const array1 = [1,2,3,4]
const reducer = (accumulator,currentValue) => accumulator + currentValue
// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer))
// expected output: 10
// 1 + 2 + 3 + 4 + 5
console.log(array1.reduce(reducer,5))
// expected output: 15
reducer 函数接收4个参数:
Accumulator (acc) (累计器)
Current Value (cur) (当前值)
Current Index (idx) (当前索引)
Source Array (src) (源数组)
Array.prototype.slice()
slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 原数组的浅拷贝, (包括 begin 不包括 end) 原始数组不会变改变