纯函数是函数式编程的基础。 他们为简单和可测试性而受到崇拜。
在本文中,您将找到一个
清单 ,该
清单将有助于确定某个函数是否为纯函数。

检查清单
一个函数必须满足两个条件才能被视为“纯”:-每次使用相同的参数集调用函数时,函数返回相同的结果
-无副作用
让我们更详细地考虑。
1.相同的输入=>相同的输出
比较一下:
const add = (x, y) => x + y; add(2, 4); // 6
与此:
let x = 2; const add = (y) => { x += y; }; add(4); // x === 6 (the first time)
在第一种情况下,无论您在何处/何时调用该值,都会根据指定的参数返回该值。
如果将2和4相加,则总得到6。
没有任何影响结果。
函数不纯=结果不一致第二个示例不返回任何内容。 他依靠一般条件通过增加领域外的变量来开展工作。
该模型是开发人员的噩梦。
共享状态引入了时间依赖性。 根据调用函数的时间,您将获得不同的结果。 第一次结果是6,下一次是10,依此类推。
哪个更好?在那种情况下,您会得到更少的仅在特定条件下出现的错误?
在哪种情况下,您更有可能在时间依赖性可能会破坏系统的多线程环境中成功?
绝对在第一。
2.无副作用

该测试本身就是一个清单。
副作用示例:- 修改输入参数
- console.log
- HTTP调用(AJAX /提取)
- 文件系统变更
- DOM请求
实际上,功能执行的任何工作都与计算最终结果无关。
我建议您观看Bob Martin的
视频 。
这是带有副作用的“脏”功能。
const impureDouble = (x) => { console.log('doubling', x); return x * 2; }; const result = impureDouble(4); console.log({ result });
console.log这里是一个副作用,但不会造成伤害。 给定相同的数据,我们仍将获得相同的结果。
但是,这可能会引起问题。
“不纯”的对象更改
const impureAssoc = (key, value, object) => { object[key] = value; }; const person = { name: 'Bobo' }; const result = impureAssoc('shoeSize', 400, person); console.log({ person, result });
由于通过赋值语句声明了函数,因此永远更改了person变量。
共享状态意味着
impureAssoc的影响不再完全明显。 了解对系统的影响现在包括跟踪它曾经接触过的每个变量并了解其历史。
共享状态=时间依赖性。我们可以通过简单地返回具有所需属性的新对象来清除
impureAssoc 。
“我们清理它” const pureAssoc = (key, value, object) => ({ ...object, [key]: value }); const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result });
PureAssoc现在会返回测试结果,因此您不必担心它是否在其他地方发生了变化。
可以这样完成:
const pureAssoc = (key, value, object) => { const newObject = { ...object }; newObject[key] = value; return newObject; }; const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result });
更改输入可能很危险,但是更改副本不是问题。 最终结果是一个可测试的,可预测的函数,无论您在何时何地调用它,都可以正常工作。
更改仅限于此小区域,并且您仍在返回值。
总结- 如果函数没有副作用,并且每次使用相同的参数集调用时,返回的结果都是相同的,则该函数是纯函数。
- 副作用包括:更改输入,HTTP调用,写入磁盘,输出到屏幕。
- 您可以安全地克隆,然后更改输入参数。 只需保持原样不变即可。
- 分发语法(...语法)是克隆对象和数组的最简单方法。