- 函数式编程思维
- 函数式编程常用的核心概念
概念:
1、函数是一等公民。所谓“一等公民”,指的是函数与其他数据类型一样,处于平等地位,可以复制给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
2、不可改变量。在函数式编程中,我们通常理解的变量在函数式编程中也被函数代替了:在函数式编程中变量仅仅代表某个表达式。这里说的‘变量’是不能被小改的。所有的变量只能被赋值一次初值
3、map & reduce 他们是最常用的函数式编程
特性:
- 函数是 “一等公民”
- 只用 “表达式”,不用 “语句”
- 没有 “副作用”
- 不修改状态
- 引用透明(函数运行只靠参数)
函数式编程常用的核心概念
1、纯函数
- 对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态
例:Array.slice()
就是纯函数,对于固定的输入,输出总是固定的,Array.splice()
就不是一个纯函数,对于引用对象来说改变本身
2、函数的柯里化
事实上柯里化是一种“预加载”函数的方法,通过传递较少的参数,得到一个已经记住了这些参数的新函数,某种意义上讲,这是一种对参数的 “缓存” ,是一种非常高效的编写函数的方法
例如:
let checkage = function(min) {
return function (age) {
return age > min;
}
}
3、函数组合
对于函数柯里化拆分后的函数,调用时会出现 “洋葱式” 代码,这个时候需要函数组合
4、Point Free
把一下对象自带的方法转化成纯函数,不要命名转瞬即逝的中间变量
这个函数中,我们使用了 str 作为我们的中间变量,但这个中间变量除了让代码变得长了一点以外没有任何意义
例:const f = str => str.toUpperCase().split('')
5、声明式与命令式代码
命令式代码的意思就是,我们通过便写一条又一条的指令去让计算机执行一些动作,这其中一半都会涉及到很多繁杂的细节。而声明式就要优雅很多,我们通过写表达式的方法来声明我们想干什么,而不是通过一步一步的指示。
// 命令式
let CEOs = [];
for(let i = 0,i < companies.length;i++) {
CEOs.push(compaies[i].CEO)
}
// 声明式
let CEOs = companise.map(c => c.CEO);
6、惰性求值
函数式编程的优缺点
函数式编程的一个明显的好处就是这种声明式的代码,对于无副作用的纯函数,我们完全可以不考虑函数内部式如何实现的,专注于编写业务代码。优化代码时,目光只需要集中在这些稳定兼顾的函数内部即可。
相反,不纯的函数式代码会产生一些副作用或者依赖于外部的一些环境变量,使用他们的时候总要考虑这些不干净的副作用。在复杂的系统中,这对于程序员的心智来说是极大的负担。