curry js实现
curry js实现
在JavaScript中,柯里化(Curry)是一种将多参数函数转换为一系列单参数函数的技术。柯里化后的函数可以逐步接收参数,直到所有参数都被收集完毕,最后返回结果。

基本柯里化实现
以下是一个简单的柯里化函数实现:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
};
}
};
}
使用示例
function add(a, b, c) {
return a + b + c;
}
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1)(2, 3)); // 6
支持占位符的柯里化
如果需要支持占位符(如_)来跳过某些参数的传递,可以使用以下实现:
function curryWithPlaceholder(fn) {
return function curried(...args) {
const complete = args.length >= fn.length && !args.includes(curryWithPlaceholder.placeholder);
if (complete) {
return fn.apply(this, args);
} else {
return function(...args2) {
const mergedArgs = args.map(arg =>
arg === curryWithPlaceholder.placeholder && args2.length ? args2.shift() : arg
).concat(args2);
return curried.apply(this, mergedArgs);
};
}
};
}
curryWithPlaceholder.placeholder = Symbol('_');
使用示例(带占位符)
function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = curryWithPlaceholder(multiply);
const _ = curryWithPlaceholder.placeholder;
console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(_, 3)(2)(4)); // 24
console.log(curriedMultiply(2, _, 4)(3)); // 24
注意事项
- 柯里化函数的参数数量由原始函数的
length属性决定,因此需确保原始函数有明确的参数列表。 - 箭头函数的
length属性可能不符合预期,建议使用普通函数。 - 柯里化后的函数在参数不足时会返回新函数,直到参数足够时才执行原始函数。
以上实现可以满足大多数柯里化需求,根据具体场景可以选择基本版本或支持占位符的版本。







