第二部分函数基础部分
1. 轻数据结构,重操作
1.1. 控制流
控制流:程序为实现业务目标所要进行的路径
使用函数式开发其实就是将数据与控制流视为一些高级组件的简单链接
1.2. 链接方法
方法链式一种能够在一个语句中调用多个方法的面对对象编程模式。方法链又称方法级联
1.3. 函数链
函数式编程不是通过创建一个全新的数据结构类型来满足特定的需求,而是使用如数组这样的普通类型并施加在一套粗粒度的高阶操作之上。
设计思路
- 接收函数作为参数,以便能够注入解决特定任务的特定行为
- 代替充斥临时变量与副作用的传统循环结构,从而减少所要维护以及可能出错的代码
lambda表达式(在js中成为箭头函数)
高阶函数中 - reduce:将一个数组中的元素精简为单一的值,该值是由每个元素与一个累积值通过一个函数计算得出的。reduce依赖于累计的结果而且还是一个会应用到所有元素的的操作,所以没有办法跳出循环
- filter:在处理大数据的时候,往往需要删除部分不能不需要的数据,filter是一个能够遍历数组中的元素并返回一个新子集数组的高阶函数
function filter(arr, predicate) {
let idx = -1,
len = arr.length,
result = [];
while (++idx < len) {
let value = arr[idx];
if(predicate(value,idx,this)){ // 这里是指定this的作用域对象(window)
result.push(arr[idx])
}
}
return result
}
console.log(filter([1,2,3,4], a=> a>2)) // [3,4]
1.4. 代码推理
函数式的控制流能给个不需要研究任何内部细节的条件下提供该程序意图的清晰结构,这样可以知道数据在不同阶段式如何流入和流出的
函数式编程在理论上讲,无论是使用数组,链表,二叉树,还是其他数据结构,都不会改变程序原来的语义。所以函数式编程更关注于操作而不是数据结构
- _.chain():1.可以添加一个输入对象的状态从而能够将这些输入转换为所需输出的操作连接在一起. 2. 可以创建具有惰性计算能力的复杂程序
_.chain
创建一个lodash包装实例,包装value以启用显式链模式。要解除链必须使用 _#value 方法。
let students = ['Rosser', 'Turing', 'Kleene', 'Church'];
const chain = _.chain(students).value()
console.log(chain) //[ 'Rosser', 'Turing', 'Kleene', 'Church' ]
- _mixins: _.mixin([object=lodash], source, [options={}])
添加来源对象自身的所有可枚举函数属性到目标对象。 如果 object 是个函数,那么函数方法将被添加到原型链上。
function voms(string){
return _.filter(string, e=> /[aeiou]/i.test(e));
}
_.mixin({'voms':voms});
console.log(_.voms('fres')) // ['e']
递归定义的数据结构
节点是一种包含了当前值,父节点和子节点数组的对象。如果一个节点没有父节点则被称之为根节点
树是包含了一个根节点的递归定义的数据结构
函数式编程的关键
在操作不可变,无副作用的数据类型时,封装数据以控制其访问
网友评论