柯里化函数通过预设部分参数返回新函数,结合默认值实现参数填充;核心是用闭包和function.length判断参数数量,用defaults数组补全未传参数,支持占位符跳过中间参数。

柯里化函数本身不直接“填充默认参数”,而是通过**预设部分参数**,返回一个新函数,从而在后续调用中自然“省略”已固定的参数。实现参数默认填充,本质是把柯里化和默认参数逻辑结合——常见做法是:在柯里化过程中,对未传入的参数位置使用默认值替代。
用闭包 + 参数长度判断实现默认填充
核心思路:记录期望总参数个数,每次调用时收集实参,当数量不足时返回新函数;当参数足够或显式传入 undefined(需区分是否为“未传”),再用默认值补全。
- 用 Function.length 获取原函数形参个数(注意:箭头函数无 length,需手动指定)
- 维护一个默认值数组(如 defaults = [10, 'hello']),与形参位置对应
- 每次调用时,将实参与 defaults 合并:实参有值就用实参,为 undefined 或空缺就取 defaults 对应项
带默认值的通用柯里化函数示例
以下是一个支持默认值填充的 currying 实现:
function curryWithDefaults(fn, defaults = []) {
return function curried(...args) {
const allArgs = [...args];
// 补齐默认值:只对未提供的位置填充
for (let i = args.length; i = fn.length) {
return fn(...allArgs);
}
return (...more) => curried(...allArgs, ...more);
};
}
// 示例:add(a, b, c) 默认 a=1, b=2, c=3
function add(a, b, c) { return a + b + c; }
const addCurried = curryWithDefaults(add, [1, 2, 3]);
addCurried(); // 6 → 1+2+3
addCurried(10); // 15 → 10+2+3
addCurried(10, 20); // 33 → 10+20+3
addCurried(10, 20, 30); // 60
更灵活:支持显式跳过 + 占位符
若想支持“跳过中间参数”,可用占位符(如 _)标记待填位置:
- 定义全局占位符 const _ = Symbol('placeholder');
- 合并参数时,遇到 _ 就跳过,继续用默认值;遇到真实值则覆盖
- 这样可写 addCurried(_, _, 100) 表示只指定第三个参数,前两个用默认值
注意事项
JavaScript 原生不提供“参数空缺感知”,所以必须靠调用约定或占位符来区分“没传”和“传了 undefined”。若业务中允许传 undefined 作为有效值,就不能用 === undefined 判断,而应改用 arguments.length 或 rest 参数长度做依据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











