实现:
add(1) // 1
add(1)(2)// 3
add(1, 2)(3, 4, 5)(6) // 21
对于不定参数的求和处理比较简单,很容易想到通过 arguments 或者扩展符的方式获取数组形式的参数,然后通过 reduce 累加求和。但如果直接返回结果那么后面的调用肯定会报错,所以每次返回的必须是函数,才能保证可以连续调用。也就是说 add 返回值既是一个可调用的函数又是求和的数值结果。
要实现这个要求,我们必须知道函数相关的两个隐式转换函数 toString() 和 valueOf()。toString() 函数会在打印函数的时候调用,比如 console.log、valueOf 会在获取函数原始值时调用,比如加法操作。
具体代码实现如下,在 add() 函数内部定义一个 fn() 函数并返回。fn() 函数的主要职能就是拼接参数并返回自身,当调用 toString() 和 valueOf() 函数时对拼接好的参数进行累加求和并返回。
解答:
function add(...args) {
let arr = args
function fn(...newArgs) {
arr = [...arr, ...newArgs]
return fn;
}
fn.toString = fn.valueOf = function() {
return arr.reduce((acc, cur) => acc + parseInt(cur))
}
return fn
}