这是我参与「第四届青训营 」笔记创作活动的的第17天
函数式编程
js中函数是一等公民,可以传过去传过来,可以像变量一样,就是函数在js中很牛
命令式和声明式(函数式编程是声明式的一部分)
命令式就是将具体实现写出来
而声明式只是写一个函数而已,实现过程被隐藏
函数式编程的基本概念
-
不可变性
不是说数据完全不变,而是源数据不变,想要改变数据时操作数据的副本
- Object.assign(target,copy1,copy2,...)
- array.concat(item1,itme2)
- {...obj,key:value}
- [...array,item]
- arr.filter(v=>boolean)
- arr.join("/n")
- arr.map(v=>newitem) 都是返回新的体现了不变性
-
纯函数
接收至少一个参数,并返回一个值得函数,且不改变外表环境,把参数视为不可变量
-
数据转换
数据不可变性=>数据转换(通过纯函数将元数据处理成我们需要的格式并产生副本) 在这里3个基本准则已经联系起来了
-
Object.keys(obj) 返回key组成的数组
-
reduce/reduceRight(将数组转成基本数据类型)(reduceRight只是从右边开始罢了)
array.reduce((changevalue,value)=>changevalue,initvalue) //从数组到返回你想要的任何reduce是适合返回一个值(任意,就算是函数都行)what需要每一个或大多数组值都要参与且不断的将每次的处理结果反馈给下一次的
-
-
高阶函数
-
递归
const countdown=(value,fn,delay)=>{ fn(value) return value>0?settimeout(()=>countdown(value-1)):value }适合在搜索数据结构中使用
-
合成
- 就是把一些小型的纯函数综合运用构建一个大型应用
- 合成方法
-
可以用点语法串联在一起 一个函数处理上一个函数的结果
-
创建高阶函数来合成大型函数
const both=compose(fnc1,fnc2...) both(initarg); const compose=(...fns)=>initarg=> fns.reduce((changevalue,fnc)=>fnc(changevalue),initarg)