在JavaScript
中有一个名为pure function
的概念。它的一个特点是它总是返回一个testable result
。我对此感到非常困惑。我想知道它的定义和目标以及为什么。
A"可测试结果";不是JS术语。是一个物理学术语。当你说";可测试结果";就是当你采取同样的行动,得到同样的结果。
例如:
- 如果你在同一距离投球,它总是在同一时间触地
- 如果你在1小时内以60公里/小时的速度行驶,你将行驶60公里
因此,在软件中,可测试的结果将是函数,当您传递相同的参数时,您将获得相同的结果。
例如:
cos(x)
//一切都一样max(a,b,c)
//一切都一样uppercase(str)
//一切都一样
不可测试结果:
random(from, to)
//差异结果uuid(str)
//差异结果getNowTime(format)
//差异结果
现在,pure-function
的概念是:
- 是一个";可测试结果">(换句话说:如果你发送相同的args,你会得到相同的结果(
- 不使用输入或输出流
- 不使用全局变量(仅使用局部变量和自变量(
- 不更改局部静态变量
- 不改变任何论点
在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请求不是纯函数";这是因为CCD_ 11使用I/O流并且获得不同结果的可能性很高。
编辑:对于纯函数来说,最重要的情况是因为它们是"可测试的";所以你可以在没有任何顾虑的情况下进行单元测试;副作用";在您的代码中。