前端面试 P016:纯函数、副作用与参数共享
目前顯示中文(中國)原文
来源:方格前端讲面试 · 16. 纯函数、副作用与函数式编程初识,24 分 04 秒。
回看定位:01:23 纯函数条件 · 12:41 数组参数 · 18:13 隔离副作用
判断纯函数的两个条件
相同输入得到可预测的相同结果;执行过程不产生外部可观察副作用。修改传入对象、修改外部变量、网络与文件 IO、DOM 更新、console 输出,都是常见需要识别的交互。
依赖 Date.now、Math.random 会使结果取决于隐含环境,不满足相同显式输入得相同输出。可以把时间、随机源显式作为依赖传入,方便验证业务逻辑。
function addItem(items, item) {
return [...items, item];
}
const original = [1, 2];
const next = addItem(original, 3);
console.log(original); // [1, 2]
console.log(next); // [1, 2, 3]
内部创建并修改一个没有被外部共享的局部容器,不一定破坏对外纯度。重点是可观察行为,不是代码里有没有赋值运算符。
必须纠正:对象参数仍然是按值传递
本集讲修改数组参数时,口述出现“对象和数组按引用传递”。这个说法与 P003 的正确说明矛盾。JavaScript 形参是独立绑定,得到同一个对象值;改共享对象属性会影响调用方可见数据,给形参重新赋值不会改变外部变量。
function change(items) {
items.push(3);
items = [9];
}
const values = [1, 2];
change(values);
console.log(values); // [1, 2, 3]
这里的副作用来自 push 修改共享数组,不代表参数变成外部变量的别名。完整解释见 JavaScript 函数传参:值传递与对象引用。
纯计算与外部交互如何配合
真实应用需要 IO。可以把计算下一个状态、校验数据等核心逻辑写成纯函数,把请求、持久化、UI 更新放在清楚的边界。不要把“有副作用”理解成“坏代码”。
map、filter 的纯度还取决于回调与读取对象的行为;仅返回新数组不够,见 前端面试 P005:数组方法、可变性与回调副作用。修改嵌套字段时,可以复制修改路径,不必默认深拷贝全部状态。
视频强调可测试性和副作用隔离的方向正确。“天然并行安全”也需要输入不被其他执行流同时改动等前提;纯函数不会自动替共享内存同步和 Worker 通信做决定。