2025-08-27 模拟面试(九)

一、什么是柯里化?

科里化是一种将接受多个参数的函数转换为接受一个单一函数(最初函数的第一个参数),并返回接受余下参数且返回结果的新函数的技术。 简单来说,它就是一个把多参数函数变成一系列单参数函数的过程。

通俗比喻: 普通函数:add(1, 2, 3) → 一次性吃完所有菜 柯里化函数:add(1)(2)(3) → 一道菜一道菜地吃

  1. 参数复用(最常见)
  2. 延迟执行/惰性求值
  3. 函数组合
  4. 提高代码可读性和维护性
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);
    });
  });
};

results matching ""

    No results matching ""