纯函数要求相同输入必得相同输出,且无外部状态修改与副作用;需避免可变数据、全局变量、异步/i/o操作,输入仅来自参数,输出仅通过return返回,对象/数组须用不可变方式处理。

纯函数的核心是:相同输入永远返回相同输出,且不修改外部状态、不产生副作用。在 JavaScript 中编写纯函数,关键在于规避可变数据、全局变量、异步操作和 I/O 等干扰因素。
确保输入只来自参数,输出只通过 return 返回
函数不能读取或修改闭包外的变量、全局变量、对象属性(除非是只读副本),也不能调用非纯函数(如 Date.now()、Math.random()、console.log)。
- ✅ 好例子:计算数组总和
- ❌ 避免:依赖外部变量
const multiplySum = (arr) => arr.reduce((a, b) => a + b, 0) * multiplier; // 不纯:依赖外部可变变量
禁止修改传入的对象或数组(避免突变)
原始值(string、number、boolean)天然不可变,但对象和数组默认可变。纯函数中需用展开语法、map、filter、slice 等生成新数据,而非 push、splice、sort(原地修改版)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:返回新数组
- ❌ 错误:修改原数组
处理对象时优先使用结构化拷贝与不可变更新
修改对象字段也需新建对象,可用展开运算符、Object.assign({}, obj, updates) 或专用库(如 Immer)。深层嵌套时注意浅拷贝局限。
- ✅ 浅层更新
- ✅ 深层更新(手动)
...user,
contact: { ...user.contact, email: newEmail }
});
副作用必须显式分离,不藏在纯函数内部
网络请求、DOM 操作、localStorage、日志打印等都属于副作用。纯函数只负责“算”,把副作用交给外部(如 React 的事件处理器、Redux Thunk、或组合函数如 pipe)。
- ✅ 分离设计
// 副作用交给调用方
if (!validateEmail(input)) {
alert('邮箱格式错误'); // 这里才触发副作用
}
- ❌ 混在一起
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(str)) {
alert('邮箱格式错误'); // 函数自己触发副作用 → 不纯
}
return true;
};
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










