纯函数是输入确定则输出确定、不修改也不依赖外部状态的函数,需同时满足无副作用和引用透明两大要求,通过避免突变、显式传参、封装非纯操作等实践提升代码稳定性与可维护性。

纯函数不是一种高级技巧,而是一种明确的约束:输入确定,输出就确定;不改外面,也不依赖外面。写对了,代码自然更稳、更好改。
纯函数的两个硬性要求
要算纯函数,必须同时满足:
-
无副作用:不修改全局变量、不改传进来的对象或数组、不发请求、不读写 DOM、不调用
Date.now()或Math.random() - 引用透明:给同一个参数,每次调用都返回完全一样的结果,结果只由参数决定,不掺杂时间、用户输入、随机数等不可控因素
怎么写出真正的纯函数
关键不在“做什么”,而在“不做什么”。几条实操原则:
- 对象/数组参数别直接改——用展开运算符、
Object.assign、structuredClone或Array.from创建新副本再处理 - 避免非确定性操作:需要随机数?把随机值当参数传进来;需要当前时间?让调用方传
now时间戳 - 所有依赖显式传参:不从闭包、模块顶层读取可变变量(常量除外)
- 字符串和数字天然不可变,这类操作通常自带纯性,比如
str.toUpperCase()、a + b
纯函数怎么提升可维护性
它不直接“写得漂亮”,而是从底层减少出错可能和理解成本:
- 重构放心:函数只靠输入,改内部逻辑不影响外部,不用通读整个调用链
- 测试省心:一个输入配一个预期输出,不用 mock 全局状态、不用清理副作用
- 复用安心:同一组数据在不同场景下调用,结果始终一致,不会“这次对、下次错”
- 副作用集中:把 API 调用、DOM 更新、日志打印等收口到少数地方,业务逻辑层保持干净,一眼看清数据流向
配合集合操作保持纯性
数组方法本身不全是纯的,用法决定性质:
- ✅ 安全用法:
map()、filter()、flatMap()、toSorted()、slice()、展开语法 - ❌ 危险用法:
push()、splice()、sort()(原地)、reverse()(原地) - Set/Map 操作也建议封装:比如用
new Set([...oldSet, newItem])替代set.add(),除非明确需要突变且上下文可控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











