10道JavaScript函数式编程面试题详解

本文将带你深入了解函数式编程的核心概念,并通过10道经典面试题,帮助你巩固知识,提升面试技巧。

1. 如何在 JavaScript 中实现柯里化函数?

柯里化是一种将接受多个参数的函数转换为接受一个参数的函数的技术,这个新函数返回另一个函数,直到接收了所有参数为止。

function curry(fn) {
  const arity = fn.length;
  return function curried(...args) {
    if (args.length >= arity) {
      return fn(...args);
    } else {
      return (...nextArgs) => curried(...args, ...nextArgs);
    }
  }
}

// 例子
const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);

console.log(curriedAdd(1)(2)(3)); // 输出 6

2. 什么是闭包?请举一个例子。

闭包是指函数可以访问其词法作用域之外的变量,即使该函数已经执行完毕。

function outer() {
  let outerVar = 'Hello';
  return function inner() {
    console.log(outerVar); // 访问外层函数的变量
  }
}

const innerFunc = outer();
innerFunc(); // 输出 'Hello'

3. 如何使用 JavaScript 实现一个 Promise?

Promise 用于异步操作,表示一个最终将产生结果的事件。

function myPromise(executor) {
  let resolve, reject;
  this.then = (onFulfilled, onRejected) => {
    resolve = onFulfilled;
    reject = onRejected;
  }
  executor(resolve, reject);
}

// 例子
const myPromise = new myPromise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise fulfilled!');
  }, 1000);
});

myPromise.then((value) => console.log(value)); // 输出 'Promise fulfilled!'

4. 如何使用 JavaScript 实现一个函数式的 compose 函数?

compose 函数将多个函数按顺序从右到左依次执行,每个函数的返回值作为下一个函数的参数。

function compose(...fns) {
  return function(value) {
    return fns.reduceRight((acc, fn) => fn(acc), value);
  }
}

// 例子
const addOne = (x) => x + 1;
const double = (x) => x * 2;
const composeFunc = compose(double, addOne);

console.log(composeFunc(5)); // 输出 12

5. 什么是纯函数?请举一个例子。

纯函数是指给定相同的输入,始终返回相同的输出,且不产生副作用。

function add(a, b) {
  return a + b;
}

console.log(add(2, 3)); // 输出 5
console.log(add(2, 3)); // 输出 5

6. 如何使用 JavaScript 实现一个函数式的 map 函数?

map 函数用于遍历数组,并将每个元素传递给一个函数,返回一个新的数组,其中包含每个元素被该函数处理后的结果。

function myMap(array, fn) {
  const newArray = [];
  for (let i = 0; i < array.length; i++) {
    newArray.push(fn(array[i]));
  }
  return newArray;
}

// 例子
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = myMap(numbers, (x) => x * x);

console.log(squaredNumbers); // 输出 [1, 4, 9, 16, 25]

7. 如何使用 JavaScript 实现一个函数式的 filter 函数?

filter 函数用于遍历数组,并根据给定函数的返回值,返回一个新的数组,其中包含所有满足条件的元素。

function myFilter(array, fn) {
  const newArray = [];
  for (let i = 0; i < array.length; i++) {
    if (fn(array[i])) {
      newArray.push(array[i]);
    }
  }
  return newArray;
}

// 例子
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = myFilter(numbers, (x) => x % 2 === 0);

console.log(evenNumbers); // 输出 [2, 4]

8. 如何使用 JavaScript 实现一个函数式的 reduce 函数?

reduce 函数用于将数组中的元素累积成一个单一的值。

function myReduce(array, fn, initialValue) {
  let accumulator = initialValue;
  for (let i = 0; i < array.length; i++) {
    accumulator = fn(accumulator, array[i]);
  }
  return accumulator;
}

// 例子
const numbers = [1, 2, 3, 4, 5];
const sum = myReduce(numbers, (acc, val) => acc + val, 0);

console.log(sum); // 输出 15

9. 什么是柯里化(Currying)?请举一个例子。

柯里化是一种将接受多个参数的函数转换为接受一个参数的函数的技术,这个新函数返回另一个函数,直到接收了所有参数为止。

function add(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    }
  }
}

// 例子
console.log(add(1)(2)(3)); // 输出 6

10. 如何使用 JavaScript 实现一个函数式的 pipe 函数?

pipe 函数将多个函数按顺序从左到右依次执行,每个函数的返回值作为下一个函数的参数。

function pipe(...fns) {
  return function(value) {
    return fns.reduce((acc, fn) => fn(acc), value);
  }
}

// 例子
const addOne = (x) => x + 1;
const double = (x) => x * 2;
const pipeFunc = pipe(addOne, double);

console.log(pipeFunc(5)); // 输出 12

总结

本文介绍了10道JavaScript函数式编程面试题,涵盖了柯里化、闭包、Promise、compose、纯函数、map、filter、reduce、pipe等重要概念,希望能够帮助你更好地理解函数式编程,并在面试中取得好成绩。

10道JavaScript函数式编程面试题详解

原文地址: https://www.cveoy.top/t/topic/lHuS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录