0

里面有JavaScript一个概念叫pure function。它的一个特点是它总是返回一个testable result. 我对此很困惑。我想知道它的定义和目标以及它的原因。

4

1 回答 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 回答