JavaScript函数式编程通过约定与工具实践,强调纯函数、不可变数据、高阶函数和函数组合,以减少副作用、提升可测试性与可推导性。

JavaScript 中函数式编程不是靠语法强制,而是通过约定、模式和工具来实践。它强调纯函数、不可变数据、函数组合与高阶函数,目标是减少副作用、提升可测试性和可推导性。
纯函数(Pure Functions)
纯函数指:相同输入永远返回相同输出,且不修改外部状态、不依赖外部变量、不触发 I/O 或 DOM 操作。
- ✅ 好例子:const add = (a, b) => a + b; —— 无副作用,结果只取决于参数
- ❌ 反例:red">const now = () => new Date(); —— 每次调用结果不同;arr.push(x) —— 修改原数组
- 好处:易于缓存(memoization)、并行执行、单元测试零依赖
不可变性(Immutability)
避免直接修改对象或数组,而是创建新副本。原生 JS 不提供深层不可变支持,需靠习惯或辅助工具。
- 数组操作用 map/filter/reduce/slice/concat,不用 push/pop/splice
- 对象更新用展开运算符:const newObj = { ...oldObj, name: 'Alice' };
- 深层嵌套推荐 immer(写法像可变,底层自动产生新引用)或 lodash/fp.set
高阶函数与函数组合
函数可以作为参数传入、作为返回值返回,这是函数式编程的基石。
立即学习“Java免费学习笔记(深入)”;
- map、filter、reduce 是最常用的高阶函数
- 手动组合两个函数:const compose = (f, g) => x => f(g(x));
- 更实用的组合(从右到左):const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);
例如:pipe(toUpper, trim, reverse)(' hello ') → 'OLLEH'
常用工具与库
原生 JS 已足够起步,但生态工具能显著降低心智负担。
- Ramda:专为函数式设计,所有函数自动柯里化、数据最后(R.filter(R.gt(10), [1,12,5])),支持函数组合
- lodash/fp:lodash 的函数式版本,API 与原版兼容,柯里化 + 不可变默认行为
- immer:处理复杂状态更新时保持不可变语义,写法自然
- Recoil / Zustand(配合 FP 风格):状态管理中避免直接 mutate,用 pure updater 函数











