什么是immutable
Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。
其中有 3 种最重要的数据结构:
Map:键值对集合,对应于 Object,ES6 也有专门的 Map 对象
List:有序可重复的列表,对应于 Array
Set:无序且不可重复的列表
immutable对象和原生对象的相互转换
// 原生对象转 immutable 对象 ---------- 支持各种嵌套
// fromJS() 能够把原生的数组或者对象转换成对应的 List 或者 Map
const immutable = require('immutable')
const map = immutable.fromJS({
x: 1, y: 2, z: 3, xyz: {
good: 123
}
})
console.log('map:', map)
// 输出结果为:{'x': 1, 'y': 2, 'z': 3, 'xyz': Map {'good': 123} }
const list = immutable.fromJS([1, 2, 3], [44, 55, 66])
console.log('list:', list)
// 输出结果:[1,2,3, List [44,55,66] ]
const list_map = immutable.fromJS([1, 2, 3], [
{ x: 1, y: 2 },
{ a: 3, b: 4 }
])
console.log('list_map:', list_map)
// 输出结果:[1,2,3, Map [{'x':1,'y':2}, Map[{'a':3, 'b': 4}]] ]
// immutable 对象转 原生对象 ---------- 支持各种嵌套
// toJS() 转换为原生对象
// List -> 数组
// Set -> 数组
// Map -> 对象
const {List, Map, Set} = require('immutable')
const ls = List([1,2,3,4])
const arr1 = ls.toJS(ls)
console.log('arr1:', arr1)
// 输出结果:[1,2,3,4]
const mp = Map({x:1,y:2})
const obj = mp.toJS(mp)
console.log('obj:', obj)
// 输出结果:{'x':1,'y':2}
const st = Set([11,22,33,22]);
const arr2 = st.toJS(st)
console.log('arr2:', arr2)
// 输出结果:[11,22,33] ----- 先去重再转换