RN|RN - immutable 简单学习、用法(转)

【RN|RN - immutable 简单学习、用法(转)】转自 - https://segmentfault.com/a/1190000002909224
转自 - https://zhuanlan.zhihu.com/purerender/20295971
转自 - https://www.w3cplus.com/javascript/immutable-js.html
(转)什么是 Immutable Data

Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。请看下面动画:
RN|RN - immutable 简单学习、用法(转)
文章图片
网络配图.gif Immutable有什么用
Immutable Data是指一旦被创造后,就不可以被改变的数据。
通过使用Immutable Data,可以让我们更容易的去处理缓存、回退、数据变化检测等问题,简化我们的开发
Immutable的优点
  1. 使得数据可以被回溯,由于每次更改都不改变原数据,类似撤回等功能很容就可以实现
  1. 节省内存,Immutable.js 使用了 Structure Sharing 会尽量复用内存,甚至以前使用的对象也可以再次被复用。没有被引用的对象会被垃圾回收。
  1. Immutable 本身就是函数式编程中的概念,纯函数式编程比面向对象更适用于前端开发。因为只要输入一致,输出必然一致,这样开发的组件更易于调试和组装。
使用 Immutable 的缺点
  1. 需要学习新的 API
  1. 增加了资源文件大小
  1. 容易与原生对象混淆
这点是我们使用 Immutable.js 过程中遇到最大的问题。写代码要做思维上的转变。
虽然 Immutable.js 尽量尝试把 API 设计的原生对象类似,有的时候还是很难区别到底是 Immutable 对象还是原生对象,容易混淆操作。
Immutable.js 的 API 主要包含以下几部分:
  • formJS(),将 JavaScript Object 和 Array 彻底转换为 Immutable Map 和 List
  • is(),与 Object.is() 类似都是对值的比较,但它会将 Immutable Iterable 视为值类型数据而不是引用类型数据,如果两个 Immutable Iterable 的值相等,则返回 true。与 Object.is() 不同的是,is(0, -0) 的结果为 true
  • List,有序索引集,类似于 JavaScript 中的 Array
  • Map,无序 Iterable,读写 Key 的复杂度为 O(log32 N)
  • OrderedMap,有序 Map,排序依据是数据的 set() 操作
  • Set,元素为独一无二的集合,添加数据和判断数据是否存在的复杂度为 O(log32 N)
  • OrderedSet,有序 Set,排序依据是数据的 add 操作。
  • Stack,有序集合,且使用 unshift(v)shift() 进行添加和删除操作的复杂度为 O(1)
  • Range(),返回一个 Seq.Indexed 类型的数据集合,该方法接收三个参数 (start = 1, end = infinity, step = 1),分别表示起始点、终止点和步长,如果 start 等于 end,则返回空的数据结合
  • Repeat(),返回一个 Seq.indexed 类型的数据结合,该方法接收两个参数 (value,times),value 表示重复生成的值,times 表示重复生成的次数,如果没有指定 times,则表示生成的 Seq 包含无限个 value
  • Record,用于衍生新的 Record 类,进而生成 Record 实例。Record 实例类似于 JavaScript 中的 Object 实例,但只接收特定的字符串作为 key,且拥有默认值
  • Seq,序列(may not be backed by a concrete data structure)
  • Iterable,可以被迭代的 (Key, Value) 键值对集合,是 Immutable.js 中其他所有集合的基类,为其他所有集合提供了 基础的 Iterable 操作函数(比如 map()filter
  • Collection,创建 Immutable 数据结构的最基础的抽象类,不能直接构造该类型
例:Record 用法
Record 在表现上类似于 ES6 中的 Class,但在某些细节上还有所不同。通过 Record() 可以创建一个新的 Record 类,使用该类可以创建具体的 Record 实例,该实例包含在 Record() 构造函数中声明的所有属性和默认值。如果 Record 实例中的某个属性被删除了或者没有声明,则只会将实例中的属性值设置为默认值
创建 Record 实例 const A = Record({ a: 1, b: 2 }); const r = new A({ a: 3 }); // => Record { "a": 3, "b": 2 } 删除实例属性 const rr = r.remove('a'); // => Record { "a": 1, "b": 2 }

此外,Record 实例还具有扩展性:
class ABRecord extends Record({a:1,b:2}) { getAB() { return this.a + this.b; } }var myRecord = new ABRecord({b: 3}) myRecord.getAB() // => 4

import Immutable from 'immutable'; const ARecord = Immutable.Record({myID: null, myName: null, myPhone: null, myAddress: null, myAge: null, mySex:null,}); export default class MyRecord extends ARecord { getMyAge(){ return 18; } }

let myrecord = new MyRecord({ myID: 737427428, myName: '张三', myPhone: '1234567890', myAddress: '北京', myAge: 18, mySex:'男', // 如果其中一个属性没声明,就是默认的 null });myrecord.abc();

    推荐阅读