2025-08-27 模拟面试(九)
一、什么是柯里化?
科里化是一种将接受多个参数的函数转换为接受一个单一函数(最初函数的第一个参数),并返回接受余下参数且返回结果的新函数的技术。 简单来说,它就是一个把多参数函数变成一系列单参数函数的过程。
通俗比喻: 普通函数:add(1, 2, 3) → 一次性吃完所有菜 柯里化函数:add(1)(2)(3) → 一道菜一道菜地吃
- 参数复用(最常见)
- 延迟执行/惰性求值
- 函数组合
- 提高代码可读性和维护性
function curry(fn) {
return function curried(...args) {
// 函数定义的参数和传入的参数一致时,立即执行(传入的多了也立即执行)
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function (...args1) {
// 否则把剩余的参数和之前的参数合并起来,递归调用curried函数,直到跳出循环
return curried.apply(this, args.concat(args1));
};
}
};
}
function sum(a, b, c) {
return a + b + c;
}
var curriedSum = curry(sum);
curriedSum(1, 2, 3); // 6
curriedSum(1, 2)(3); // 6
curriedSum(1)(2)(3); // 6
curriedSum(1)(2, 3); // 6
柯里化是函数式编程的核心概念之一,它通过: ✅ 拆分多参数函数为单参数函数链 ✅ 实现参数复用和函数复用 ✅ 支持延迟执行和惰性求值 ✅ 便于函数组合和管道操作 掌握柯里化不仅能帮助你在面试中脱颖而出,更能提升你的代码设计能力和对函数式编程的理解。
2. 实现 Promise.all
Promise.myAll = function (promises) {
return new Promise((resolve, reject) => {
var result = [];
var complete = 0;
if (promises.length === 0) {
resolve(results);
return;
}
promises.forEach((item, index) => {
Promise.resolve(item)
.then((value) => {
complete++;
result[index] = value;
if (complete === promises.length) {
resolve(result);
}
})
.catch(reject);
});
});
};