实现支持多参数柯里化的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
相关产品推荐
相关产品推荐

