📜  函数式编程 - Javascript (1)

📅  最后修改于: 2023-12-03 15:36:50.071000             🧑  作者: Mango

函数式编程 - JavaScript

函数式编程(Functional Programming)是一种编程范式,关注函数的组合和应用。与面向对象编程(Object-Oriented Programming)的关注点是对象和状态不同,函数式编程更关注函数的纯粹性和不变性。

在 JavaScript 中,函数式编程是一种广泛使用的技术,它能够帮助我们编写更安全、更可维护、更易于测试的代码。

本节将介绍 JavaScript 中的函数式编程的主要概念和实现方式。

纯函数

纯函数是指没有副作用(不会改变传入的参数和全局变量状态)并且返回结果只由输入参数决定的函数。这种函数能够保证输出结果可预测性,同时也更加容易测试和重构。

以下是一个简单的纯函数示例:

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

这个函数不会改变传入的参数,也不会影响全局变量的状态;而且返回结果只与输入参数 a 和 b 有关,因此它是一个纯函数。

高阶函数

高阶函数是指能够接受函数作为参数,并且/或者返回一个函数作为结果的函数。在 JavaScript 中,高阶函数能够让我们用更少的代码实现更多的功能。

以下是一个简单的高阶函数示例:

function applyOperation(a, b, op) {
  return op(a, b);
}

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

function subtract(a, b) {
  return a - b;
}

const result1 = applyOperation(1, 2, add); // 等价于 add(1, 2)
const result2 = applyOperation(1, 2, subtract); // 等价于 subtract(1, 2)

这个示例首先定义了一个高阶函数 applyOperation,它接受三个参数:两个数字和一个函数。在这个函数内部,它调用了这个函数并传入了这两个数字,返回结果作为该函数的结果。

然后定义了两个用于加法和减法的函数 addsubtract。这两个函数都符合纯函数的定义,没有副作用并且只依赖于输入参数。

最后,通过调用 applyOperation 并传入这两个函数,可以得到对应的加法和减法的结果。

组合函数

组合函数是指将多个函数组合为一个函数的过程。在 JavaScript 中,用于组合函数的方法有很多,包括 composepipe 等。

以下是一个简单的组合函数示例:

function compose(f, g) {
   return function(x) {
      return f(g(x));
   }
}

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

function square(x) {
  return x * x;
}

const addAndSquare = compose(square, add);
const result = addAndSquare(1, 2); // 等价于 square(add(1, 2))

这个示例首先定义了一个组合函数 compose,它接受两个函数作为参数,并返回一个新的函数。

然后定义了两个用于加法和平方的纯函数 addsquare

最后,通过调用 compose 并传入这两个函数,可以得到一个新的函数 addAndSquare,它等价于将两个函数组合起来:将两个数字相加,然后对结果进行平方。

柯里化

柯里化是指将一个多参数函数转换为一系列单参数函数的过程。在 JavaScript 中,用于柯里化的方法有很多,包括 curryuncurry 等。

以下是一个简单的柯里化示例:

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, d) {
  return a + b + c + d;
}

const curriedAdd = curry(add);

const sum1 = curriedAdd(1);
const sum2 = sum1(2);
const sum3 = sum2(3);
const result = sum3(4); // 等价于 add(1, 2, 3, 4)

这个示例首先定义了一个柯里化函数 curry,它接受一个多参数函数作为参数,并返回一个新的柯里化函数。

然后定义了一个用于加法的函数 add

最后,通过调用 curry 并传入这个函数,可以得到一个新的柯里化函数 curriedAdd。通过调用这个函数并传入一个参数,可以得到一个新的函数 sum1。继续调用这个函数并传入一个参数,可以得到一个新的函数 sum2。再继续调用这个函数并传入一个参数,可以得到一个新的函数 sum3。最后调用这个函数并传入一个参数,即可得到加法的结果。

函数组合器

函数组合器是指可组合实现多个功能的纯函数,即用小的、单一的、可组合的函数构建出大的、复杂的、功能完善的函数。

以下是一个简单的函数组合器示例:

function compose(...fns) {
  return function(x) {
    return fns.reduceRight(function(acc, fn) {
      return fn(acc);
    }, x);
  };
}

function map(fn) {
  return function(arr) {
    return arr.map(fn);
  };
}

function filter(fn) {
  return function(arr) {
    return arr.filter(fn);
  };
}

function reduce(fn, initial) {
  return function(arr) {
    return arr.reduce(fn, initial);
  };
}

const data = [1, 2, 3, 4, 5];

const result = compose(
  filter(num => num % 2 === 1),
  map(num => num * 2),
  reduce((acc, num) => acc + num, 0)
)(data); // 等价于 data.filter(num => num % 2 === 1).map(num => num * 2).reduce((acc, num) => acc + num, 0)

这个示例首先定义了一个函数组合器 compose,它接受多个函数作为参数,并返回一个新的函数。

然后定义了三个组合函数:mapfilterreduce

最后,通过调用 compose 并传入这三个函数,可以得到一个新的组合函数,即可对一个数组进行“过滤 -> 映射 -> 数组求和”操作,最终得到结果。

结语

以上介绍了 JavaScript 中函数式编程的主要概念和实现方式,包括纯函数、高阶函数、组合函数、柯里化和函数组合器等。函数式编程能够帮助我们编写更安全、更可维护、更易于测试的代码,能够提供更好的代码组织和抽象能力,受到了越来越多开发者的关注和热爱。