纯函数与不可变性
编写没有副作用且行为可预测的函数。
纯函数与不可变性 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
什么是纯函数
纯函数对于相同的输入始终返回相同的输出,并且没有副作用。它不会读取或写入外部状态,不会修改参数,也不会执行输入/输出操作。
纯函数示例
这个函数只依赖它的参数,并且只产生一个返回值。调用它不会改变外部的任何内容。
function add(a: number, b: number): number {
return a + b;
}
console.log(add(2, 3)); // 5, always非纯函数示例
这个函数会读取并修改其作用域之外的变量,因此它的结果依赖隐藏状态,并且会留下痕迹。这使它成为非纯函数。
let counter = 0;
function next(): number {
counter += 1; // side effect
return counter;
}
console.log(next(), next()); // 1 2, depends on history引用透明性
纯函数调用具有引用透明性:您可以用调用结果替换该调用,而不会改变程序。任何地方都可以将 add(2, 3) 替换为 5。
const x = add(2, 3) * 2;
const y = 5 * 2; // identical meaning
console.log(x === y); // true纯函数为何有帮助
纯函数易于测试(无需设置准备工作)、易于缓存、可以安全地并行运行,而且由于没有隐藏依赖,易于推理。
避免修改参数
修改输入数组或对象是一种调用方可能没有预料到的副作用。相反,请构建并返回一个新值。
// Impure: mutates input
function pushImpure(xs: number[], v: number) { xs.push(v); return xs; }
// Pure: returns a new array
function pushPure(xs: number[], v: number): number[] { return [...xs, v]; }使用展开进行不可变更新
展开运算符会复制对象或数组,让您可以覆盖字段而不触碰原对象。这是 TS 中进行不可变更新的主要工具。
interface User { name: string; age: number }
function birthday(u: User): User {
return { ...u, age: u.age + 1 };
}
const before = { name: "Ada", age: 30 };
const after = birthday(before);
console.log(before.age, after.age); // 30 31以不可变方式更新数组
使用 map、filter 和展开来派生新数组,而不是进行修改。原数组会保持不变,以便其他代码继续依赖它。
const nums = [1, 2, 3];
const doubled = nums.map(n => n * 2);
console.log(nums, doubled); // [1,2,3] [2,4,6]readonly 保障安全
将参数标记为 readonly 会告诉编译器(以及阅读代码的人),该函数不会修改这些参数,从而在类型层面强化纯函数特性。
function sum(xs: readonly number[]): number {
return xs.reduce((a, b) => a + b, 0);
}
console.log(sum([1, 2, 3])); // 6将副作用推向边界
真实程序需要副作用(日志记录、网络通信)。函数式风格会保持核心纯净,并将副作用隔离在边界处,使大多数代码保持可预测。
思维检查清单
对于每个函数,请问自己:它是否只依赖输入?是否只返回一个值?它是否让输入和外部世界保持不变?三个问题都回答“是”,就意味着它是纯函数。
快速检查
快速检查本课内容。
回顾
纯函数只依赖输入且不产生副作用,因此具有引用透明性。使用展开运算符、map/filter 和 readonly 进行不可变更新,并将真实世界的副作用推向程序边界。
常见问题解答
「纯函数与不可变性」课时是免费的吗?
是的 — 「纯函数与不可变性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「纯函数与不可变性」这节课中我会学到什么?
编写没有副作用且行为可预测的函数。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「纯函数与不可变性」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。