【发布时间】:2020-12-27 03:23:57
【问题描述】:
在JavaScript 中有一个名为pure function 的概念。它的一个特点是它总是返回一个testable result。我对此很困惑。我想知道它的定义和目标以及它的原因。
【问题讨论】:
标签: pure-function
在JavaScript 中有一个名为pure function 的概念。它的一个特点是它总是返回一个testable result。我对此很困惑。我想知道它的定义和目标以及它的原因。
【问题讨论】:
标签: pure-function
“可测试的结果”不是 JS 术语。是一个物理术语。当您说“可测试的结果”时,是指您执行相同的操作并获得相同的结果。
例如:
因此,在软件中,可测试的结果将是函数,当您传递相同的参数时,您将获得相同的结果。
例如:
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 流并且很有可能得到不同的结果。
编辑:纯函数最重要的情况是因为它们是“可测试的”,因此您可以毫无顾虑地进行单元测试,并且您的代码中不会出现“副作用”。
【讨论】: