📜  什么是函数式编程 - Javascript (1)

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

什么是函数式编程 - JavaScript

函数式编程(Functional Programming)是一种编程范式,其最大的特点就是强调函数的作用。在函数式编程中,函数被视为一等公民(First-class Citizen),可以像数值、字符串和对象一样被处理。

相对于传统的命令式编程范式,函数式编程具有以下几个优点:

  1. 函数式编程中的函数是纯粹的,即输入相同的参数,总是返回相同的结果,不会对外部的状态造成影响。这种特性使得函数能够被重用以及更容易进行测试。

  2. 函数式编程强调函数的组合,即将多个函数组合起来形成一个新的函数,这种方式比较容易进行代码复用,并且能够得到更好的抽象。

  3. 函数式编程支持惰性求值,即只有当需要计算结果时才进行计算。这种方式可以避免对不必要的计算造成浪费。

在 JavaScript 中,函数式编程可以使用以下方式实现:

声明式编程

声明式编程相对于命令式编程更接近函数式编程。在声明式编程中,程序员只需要描述期望得到的结果,不需要描述具体的计算步骤。

const arr = [1, 2, 3, 4, 5];
const res = arr.map((num) => num * 2).filter((num) => num > 5);
console.log(res); // [ 6, 8, 10 ]

上面的代码中,map 函数和 filter 函数都是纯函数,它们的组合形成了一个新的函数,用来处理数组中的元素。

高阶函数

高阶函数是指参数或返回值为函数的函数。高阶函数可以很好地体现出函数式编程的特点,如函数的组合、柯里化等。

const add = (x) => (y) => x + y;
const add10 = add(10);
console.log(add10(5)); // 15

上面的代码中,add 函数是一个高阶函数,它返回了一个函数。通过调用 add(10) 可以得到一个新的函数 add10,将 add105 作为参数传入后,得到了最终的结果 15

不可变性

函数式编程强调数据的不可变性,即一旦创建一个数据,它就不能被更改。在 JavaScript 中,可以使用 Object.freeze 函数来创建不可变的对象。在修改不可变的数据时,应该创建一个新的对象。

const obj = Object.freeze({ name: 'Jack', age: 20 });
// obj.age = 30; // TypeError: Cannot assign to read only property 'age' of object '#<Object>'
const newObj = { ...obj, age: 30 };
console.log(obj); // { name: 'Jack', age: 20 }
console.log(newObj); // { name: 'Jack', age: 30 }

上面的代码中,obj 对象被创建后就不能被修改,所以尝试给它的 age 属性赋值会报错。正确的做法是创建一个新的对象 newObj,并将需要修改的属性赋给它。

总结:

函数式编程是一种强调函数的作用,减少变量状态的副作用,并提高代码可读性和可维护性的范式。在JavaScript中,我们可以使用声明式编程、高阶函数和不可变性来实现函数式编程思想。