前言纯粹函数这个词,是函数型编程的基础,我想伙伴们都听说过很多。 本文主要讨论亚纯函数,包括基本概念、优点、运用经典案例,以及我们日常应该如何合理使用等。
亚纯函数的概念首先来看亚纯函数的基本概念:
相同的输入始终具有相同的输出,并且在运行过程中没有副作用。
我该怎么理解上面的概念呢? 我们要把上面的话分成两部分来看。
相同的输入,总是会得到相同的输出
请看看以下示例:
let a=1; 功能xadd (x ) { return x a; (; xadd(1; //2上的此函数不是纯函数。 之所以这么说,是因为在我们的程序运行的过程中变量a很可能会发生变化,如果变量a发生变化,我们也同样会在执行xadd(1)时得到的输出不同。
让我们来看另一个例子:
functionsum(x,y ) { return x y; (; sum (1,2 ); //3在这个例子中,符合在相同输入处获得相同输出的概念,其中sum是纯函数。
执行过程中没有任何副作用
我们需要在这里弄清楚什么是副作用。 此处的副作用是指函数正在运行时外部可观察变化
变更开始HTTP请求操作的DOM外部数据的console.log (打印数据Date.now ) )或Math.random ) )上述一系列操作可以称为副作用。 接下来,我们来看一下更改外部数据并产生副作用的示例。
let a=1; function func () { a=’b ‘; (; func (; 控制台. log (a; //b我们执行了func函数,外部变量a的值发生了变化。 因为这产生了所谓的副作用,所以func不是纯函数。 这样修改的话:
function func2() { let a=1; a=’a ‘; 返回a }; func (; //a函数fun2是不会发生从外部可观察到的变化或者产生副作用的纯函数。
是纯函数,上述两个条件是必不可少的。
亚纯函数的优点我想有些伙伴通过理解亚纯函数的概念,可以感受到亚纯函数的优点:
容易测试,结果只依赖输入,保证测试时输出稳定,便于维护和重构,便于编写高质量的代码。 不用担心函数会产生什么样的副作用来缓存结果。 在同一输入中始终使用输出相同的亚纯函数的经典案例既然亚纯函数有这么多好处,我们来看看有哪些亚纯函数的经典案例。
的基本方法数组中的许多基本方法都是纯函数,如map、forEach、filter和reduce。
redux的Reducer Redux的三个原则之一是使用纯函数执行修改。 本节介绍了使用reducer时,操作如何改变状态树。
Reducer是一个纯函数,接受以前的state和action并返回新的state。 –Redux
中文文档
Lodash Lodash是一个一致、模块化、高性能的JavaScript实用程序库。 我想很多伙伴也经常使用,这也是亚纯函数的代表。
当然有很多,但这里不举个例子。 总的来说,亚纯函数是十分常见的。
我们如何合理地用于实际开发,我们可以合理地使用纯函数来提高我们的开发效率和代码质量。
纯函数组件可以使用纯函数创建组件。
通过比较函数头(props )返回H2 ) props.text}/H2 ) Class组件的使用方式来创建组件。
您可以总结classheaderextendsreact.com ponent { render (} { return h1 { this.props.text }/h1 } }纯函数组件的优点。
没有副作用。 副作用难以捕捉的问题语法更简洁、可读性更好、代码量相对更少、易于重用、内存更小、不再需要生命周期和状态管理,无需担心性能会提高。 当然,纯函数组件也有自己的缺点。 例如,没有生命周期。
生命周期有时是必不可少的,但幸运的是,现在还有一个很好的解决方案——react-hooks。 利用hooks函数,可以在函数组件中使用与生命周期、状态管理等等价的方法。
创建使用纯函数创建公共方法的公共方法时,请尽量使用纯函数创建。
假设您要创建一个将数组中的小写字符转换为大写的公共方法。
let lists=[‘q ‘、’ w ‘、’ e’]; let upperCaseLists=()={ let arr=[]; for(letI=0,length=lists.length; ilength; I ) { let item=lists[i]; ARR.push(item.touppercase ) ); } lists=arr; }上的函数可以逻辑复用,但肯定有副作用,不适合公共方法,所以进行优化。
let upperCaseLists=(value )={ let arr=[]; for(letI=0,length=value.length; ilength; I ) { let item=value[i]; ARR.push(item.touppercase ) ); }返回arr; }使用易于阅读的forEach进行优化:
let upperCaseLists=(value )={ let arr=[]; value.foreach((item )={arr.push ) item.touppercase ) }; (返回警报; 继续在map上进一步优化:
letuppercaselists=(value ) (returnvalue.map ) (item ) (=item.toUpperCase ) )是否简洁呢? 如何优化具体方法,要根据实际情况和业务需要来决定。
见3https://segment fault.com/a/119000007491981
3359 cug gz.blog.csdn.net/article/details/113792471
https://www.redux.org.cn/
最后,纯函数这个概念其实并不复杂,在不知不觉中我们的工作中也一定遇到过,也不知不觉中用过。 只有合理运用它,才是开发中的利器。