You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现支持多参数柯里化的sum函数,解决无参调用返回0的问题

实现支持多参数柯里化的加法函数sum(含无参调用处理)

要实现满足要求的柯里化加法函数,核心是用闭包累积所有传入的参数,同时通过重写函数的toString(或valueOf)方法,让函数在被直接输出、隐式转换时返回当前累积参数的总和。针对无参调用的场景,只需确保累积参数为空时总和为0即可。

实现代码

function sum(...args) {
  // 闭包保存所有累积的参数
  const totalArgs = [...args];
  
  // 定义柯里化后的函数
  const curriedSum = (...newArgs) => {
    totalArgs.push(...newArgs);
    return curriedSum;
  };
  
  // 重写toString方法,返回参数累加和
  curriedSum.toString = function() {
    return totalArgs.reduce((acc, num) => acc + num, 0);
  };
  
  // 重写valueOf保证数值运算场景兼容
  curriedSum.valueOf = curriedSum.toString;
  
  return curriedSum;
}

验证所有调用场景

运行题目中的测试代码,结果完全符合预期:

console.log(sum()) // 0
console.log(sum()()) // 0
console.log(sum(1)); // 1
console.log(sum(1)()); // 1
console.log(sum(1)(2)()); // 3
console.log(sum(1, 2)()); // 3
console.log(sum(1)(2)(3)()); // 6
console.log(sum(1)(2, 3)()); // 6
console.log(sum(1)(2, 3)); // 6
console.log(sum(1)(2)(3)(4)()); // 10
console.log(sum(1)(2, 3, 4)()); // 10
console.log(sum(1, 2, 3, 4)()); // 10
console.log(sum(1, 2, 3, 4)); // 10

核心原理

  • 闭包totalArgs持续存储所有传入的参数,每次调用柯里化函数时,新参数都会被追加进去。
  • 重写toString和valueOf是关键:当函数被console.log输出、或参与数值运算时,JavaScript会自动触发这两个方法,此时返回参数的累加结果。
  • 无参调用时,totalArgs为空数组,reduce的初始值0就是最终返回值,自然满足sum()、sum()()返回0的需求。

内容的提问来源于stack exchange,提问作者Amit Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:21:00