javascript关于函数式编程

来源:互联网 发布:东方网络停牌是好是坏 编辑:程序博客网 时间:2024/05/07 21:25

函数式编程

函数式编程是一种编程范式。
常见的三种编程范式 有以下三种

  1. 命令式 c
  2. 函数式 go lisp
  3. 面向对象 java c++

javascript是一门多范式的编程语言 ,既可以像C语言一样 ,命令式编程也可以和java 一样 ,基于原型的继承,实现面向对象式编程。但是函数式编程是什么呢?

函数大家都不陌生。都使用过函数,函数最重要的两个部分就是输入和输出。封装中间的操作。
function add(a,b){
return a+b;
}
一个简单的函数。输入两个数,返回两个数之和。
有关于函数式编程的特性,和优点在这就不再赘述
–函数式编程

那么javascript在函数式编程中有哪些相关实现呢?

ECMA5 中出现 map filter reduce every some 方法 ,这些方法有何妙用 ?
当你想要求一个数组的最大值时,你会如何处理?

var arr = [1,5,8,6,9,4];//如果将这个放在循环中,那么每次循环都会计算arr的length的值 var len =arr.length;//大多数人的做法,先定义一个变量,存储最大值。var max=0;for(var i=0;i<len;i++){    if(arr[i]>max)    max=arr[i];}//好吧这样确实获取了最大值。但是我们有了6行代码 ,而且多了几个全局变量//稍微机智点 也许会想到我先排序一下,再取第一个嘛var len=arr.sort((a,b)=>b-a)[0];//nice 确实简洁,但是你吧arr的内容改变了,这不是我们想要的,由于我们还需要它,但是这个已经有函数式的思想了。//来让我们看看最终版的let len=arr.reduce((a,b)=>{return a>b?a:b;})//没有多余的全局变量没有修改调用的数组,而且还简洁。

关于如何求最大值的这个小例子,看看有什么,相对于第一种命令式编程,for循环的形式。代码量只有五分之一,这也是为什么函数式编程开发效率高的原因之一。
它没有对传入的数组做任何改变,也许你会疑惑这有什么用处,哦,亲那是你没有想到共享数组下(不修改原数组),如何同步,不产生多种结果的问题,这显得多么重要,那我们只需要关注逻辑的实现。
函数式编程抛弃了讨厌的循环。冗余的代码,只需要注重一个的逻辑实现即可。

map ,通过指定函数处理数组的每个元素,并返回处理后的数组。
filter ,检测数值元素,并返回符合条件所有元素的数组。
reduce,操作两个元素,将返回值和一下元素(两个元素)操作,返回最后的结果
every , 检测数值元素的每个元素是否都符合条件,返回一个布尔值。
some , 检测数组元素中是否有元素符合指定条件,返回一个布尔值。

//让我们看看,我想找到数组中的奇数,然后乘以5 再 减 4var arr=[1,2,3,4,5];var newArr=arr.filter(x=>x%2==1).map(x=>x*5-4);console.log(newArr);//[1,11,21]console.log(arr);//[1,2,3,4,5]

是不是显得如此轻巧。

显然这几个方法是相当的好用,但是这还远远不够,我们还有对象集合等一系列的集合。 看看前人的智慧吧。
underscore.js
可以将源码复制保存本地,再导入就能使用,有着不错的中文文档,和强大的功能,但是也有一点被人诟病的地方。 _ 是underscore导入的映射
_.map(arr,function);//被人诟病的地方就是参数的位置。应该是先方法再是数据 ,这是为什么呢? 我想知道函数柯里化的,都明白吧。

mori
这是一个由clojurescript 把clojure 的函数式编程带到前端。没有中文文档。

immutable
这是一个由Facebook 工程师 Lee Byron 花费 3 年时间打造的函数式编程框架。

接下来就是享受函数式快捷的编码体验了

0 0
原创粉丝点击