实现一个sum函数

# 实现一个sum函数

实现一个函数sum函数满足以下规律

sum(1, 2, 3).valueOf() // 6
sum(2, 3)(2).valueOf() // 7
sum(1)(2)(3)(4).valueOf() // 10
sum(2)(4, 1)(2).valueOf() // 9
1
2
3
4

分析

仔细观察这几种调用方式可以得到以下信息

  1. sum 函数可以传递一个或者多个参数
  2. sum 函数调用后返回的是一个新的函数且参数可传递一个或者多个
  3. 调用 .valueOf 时完成最后计算

const sum = (...args1) => {
 let fullArgs = [...args1];
 const fn = (...args2) => {
  // 收集参数
  fullArgs = [...fullArgs, ...args2];
  // 返回自身保持链式调用
  return fn;
 };

 // 重写valueOf, 累加已收集的集数
 fn.valueOf = () => {
  return fullArgs.reduce((total, cur) => (total+=cur), 0);
 };

 return fn;
}


console.log(sum(1, 2, 3).valueOf()); // 6
console.log(sum(2, 3)(2).valueOf()); // 7
console.log(sum(1)(2)(3)(4).valueOf()); // 10
console.log(sum(2)(4, 1)(2).valueOf()); // 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
上次更新: 2022/7/7 上午11:55:38