里面有JavaScript
一个概念叫pure function
。它的一个特点是它总是返回一个testable result
. 我对此很困惑。我想知道它的定义和目标以及它的原因。
问问题
39 次
1 回答
0
“可测试的结果”不是 JS 术语。是一个物理术语。当您说“可测试的结果”时,是指您执行相同的操作并获得相同的结果。
例如:
- 如果你以相同的距离扔一个球,它总是会同时击中地面
- 如果您在 1 小时内以 60 公里/小时的速度行驶,您将行驶 60 公里。
因此,在软件中,当您传递相同的参数时,可测试的结果将是函数,您将获得相同的结果。
例如:
cos(x)
// 总是一样的max(a,b,c)
// 总是一样的uppercase(str)
// 总是一样的
不可测试的结果:
random(from, to)
// 差异结果uuid(str)
// 差异结果getNowTime(format)
// 差异结果
现在,的概念pure-function
是:
- 是“可测试的结果” (换句话说:如果您发送相同的参数,您将得到相同的结果)
- 不使用输入或输出流
- 不使用全局变量(仅局部变量和参数)
- 不改变局部静态变量
- 不改变任何论点
在非纯函数的 javascript 示例中:
// Is not a testable result
function notPure(max, min) {
return Math.random() * (max - min) + min;
}
// Use output stream
function notPure(name) {
const res = "hi " + name;
console.log(res);
return res;
}
// Use global variable [This is a testable result but not pure because global variable]
const globalVar = "jett";
function notPure(lastname) {
return "hi " + globalVar + " " + lastname;
}
// In JS don't exist "local static variables" so is impossible to replicate this case
// Change an argument
function notPure(obj, key, val) {
obj[key] = val;
return obj;
}
纯函数的一些示例将是:
function pure(a, b) {
return a + b;
}
function pure(name, lastname) {
return "hi " + name + " " + lastname;
}
function pure(obj, key, val) {
const res = JSON.parse(JSON.stringify(obj));
res[key] = val;
return res;
}
在某些示例中,您会看到“如果有一个 HTTP 请求不是纯函数”,这是因为HTTP request
使用 I/O 流并且很有可能得到不同的结果。
编辑:纯函数最重要的情况是因为它们是“可测试的”,因此您可以毫无顾虑地进行单元测试,并且您的代码中不会出现“副作用”。
于 2020-12-27T04:17:14.477 回答