函数式编程在javaScript中的应用
什么是函数式编程
- 函数式编程是一种编程范式,是一种典型的声明式编程,它强调程序的执行结果而不是执行过程。
函数式编程扩展
- 编程语言的编程范式大致可分为声明式编程和命令式编程,函数式编程随着react框架的流行不断受到关注。
- 函数式编程在react中的应用
- react全局状态管理库有两种实现方案redux(函数式编程)和mobx(面向对象)
函数式编程的特点
- 函数是一等“公民”
- 意味着函数优先,提倡使用函数组合。
- 函数可以像其他数据一样,作为参数传递和作为返回值返回。
- 纯函数(无副作用)
- 纯函数的返回值只依赖于其参数,对于一个函数相同的参数一定可以得到一致的返回结果,也就是说纯函数根据输入完全可以预测输出。
- 常见的副作用是1. 修改外部变量 2. - dom查询 3. 发送http请求等
- 常见的纯函数有reducer, slice等
- 不可变数据结构
- 不修改原始数据而是返回一个新的数据,使开发更加简单,数据可回溯,减少了任何可能的副作用。
- 在react中不可变数据结构配合组件自身的浅比较优化,具有较高性能。
- 数据可变虽然可以有效的利用内存,但当应用复杂以后可能会造成很大的隐患
- 使用深浅拷贝通过复制一个新对象来实现数据不可变,这无疑会造成更多的性能问题和内存浪费。
- 对于层级不深的数据结构一般使用Object.assign(), ...扩展运算符 , Object.freeze() 或者let都可以
- 对于层级较深的数据结构可以使用深拷贝,但这不是最好的选择,因为在一个应用中,性能和内存同样重要。
- 我们还可以使用一些不可变数据结构的框架如immutable.js, immer.js , 两个框架的特点是采用结构共享,如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其他节点共享。惰性操作,在使用通过immutable创建的对象的时候,其实代码块并没有被执行,当我们访问到某个数据的时候才会被执行,比如get(1), 如果找到index === 1 时后边的数据就不会再执行了。
- immutable对项目的侵入性太强,内置了一些数据结构,对开发者来说不是很友好,需要熟悉的时间,但是immer没有这些问题,它简单,开箱即用,内部使用Proxy性能也好 个人比较推荐。