函数式编程 (Functional Programming)
核心概念:
纯函数
不可变数据
无副作用
函数是一等公民
函数组合
高阶函数
柯里化
惰性求值
递归
引用透明性
主要目标:
提高代码的可读性和可维护性
通过避免副作用和共享状态来减少错误
典型库:
Ramda
Lodash (FP 模式)
Immutable.js
示例:
import * as R from 'ramda'; const data = [1, 2, 3, 4, 5]; const double = x => x * 2; const doubledData = R.map(double, data); console.log(doubledData); // [2, 4, 6, 8, 10]
响应式编程 (Reactive Programming)
核心概念:
数据流
异步事件流
Observable
Observer
操作符
订阅和取消订阅
推模型 (Push Model)
主要目标:
处理异步数据流和事件
提供一种声明式的方式来处理异步操作
典型库:
RxJS
Bacon.js
Most.js
示例:
import { fromEvent } from 'rxjs'; import { map } from 'rxjs/operators'; const button = document.getElementById('myButton'); const clickStream = fromEvent(button, 'click'); clickStream.pipe( map(event => event.clientX) ).subscribe(x => { console.log(`Button clicked at: ${x}`); });
区别
关注点:
函数式编程:主要关注数据转换和操作,强调纯函数和不可变数据。
响应式编程:主要关注异步数据流和事件处理,强调数据流和事件流的组合和转换。
处理方式:
函数式编程:通过函数组合和高阶函数来处理数据。
响应式编程:通过 Observable 和操作符来处理异步事件流。
应用场景:
函数式编程:适用于需要进行复杂数据转换和操作的场景。
响应式编程:适用于需要处理复杂异步操作和事件流的场景。
库和工具:
函数式编程:Ramda, Lodash (FP 模式), Immutable.js
响应式编程:RxJS, Bacon.js, Most.js
总结来说,函数式编程和响应式编程是两种不同的编程范式,解决不同的问题。函数式编程主要用于数据转换和操作,而响应式编程主要用于处理异步数据流和事件。根据具体需求,可以选择适合的编程范式或结合使用。