函数式编程的主要设计点在于避免使用状态和可变的数据,即 stateless and immutable。
RXJS:响应式编程抽象出了流这个概念,提高了代码的抽象级别,我们不用去关心大量的实现细节,而专注于对数据流的操作。
目录
参考
https://www.imooc.com/article/70323 (主要看前面的关于编程思想的解说)
https://www.jianshu.com/p/3cf03ae2eac1
https://juejin.im/entry/5adcc57bf265da0ba469613f
mutable & immutable
JS 中的对象是 mutable 可变的,新对象引用了原始对象,改变新对象将影响到原始对象。mutable data的数据结构有耦合,造成了数据难以被回溯的隐患。为了解决这个问题,一般的做法是使用 shallowCopy(浅拷贝)或 deepCopy(深拷贝)来避免被修改,但这样做造成了 CPU 和内存的浪费。immutable 可以很好地解决这些问题。
immutable Data 就是一旦创建,就不能再被更改的数据。对 immutable 对象的任何修改或添加删除操作都会返回一个新的 immutable 对象。immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。
数据不可变就是指这个数据一旦产生,它的值就永远不会变。JavaScript 中字符串类型和数字类型就是不可改变的,而对象基本都是可变的,可能会带来各种副作用。
纯函数
纯函数指的是执行结果由输入参数决定,参数相同时结果相同,不受其他数据影响,并且不会带来副作用(Side Effect)的函数。副作用指的是函数做了和本身运算返回值没有关系的事情,如修改外部变量或传入的参数对象,甚至是执行 console.log 都算是 Side Effect。前端中常见的副作用有发送 http 请求、操作 DOM、调用 alert 或者 confirm 函数等。满足纯函数的特性也叫做引用透明度(Referential Transparency)。
redux状态管理方案
Redux 不允许对数据层进行修改,只允许你通过一个 Action
对象来描述需要做的变更。在 Redux 中使用一个纯函数接收原 state tree
和 action
作为参数,并生成一个新的 state tree
代替原来的。
- State(状态) 是指单一不可变数据
- Action(行为) 描述状态的变化
- Reducer(归约器/归约函数) 根据先前状态以及当前行为来计算出新的状态。纯函数。