immutable
意义
它是提供了一种不可改变的数据结构
使用场景
js中对象都是参考类型,当a,b都指向某个对象,通过a改变对象,发现b对应的对象也改变了。解决这一问题的方式,过去的方式是deep-clone
// jQuery 中提供深拷贝
var config = $.extend(true,{},defaultConfig,initConfig)
但是深拷贝效率较低,可以使用 immutable
- 比如,频繁操作
state
或者store
,配合immutableJS
更快,更安全,更方便 - Immutable 使用了结构共享,如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其他节点进行共享
常用数据结构
-
Map
,键值对集合 -
List
,有序可重复列表 -
Set
,无序不可重复的列表
优点
- 降低 Mutable 带来的复杂度
- 节省内存
- 易于开发撤销功能
- 并发安全,暂时然并卵
- 拥抱函数式编程,应该就是面向过程式编程
缺点
- 16k大小的文件
- 容易和原生对象混淆,使用严格的命名规范进行区别,比如所有 Immutable 类型对象以
$$
开头,并且使用Immutable.formJS
更多认识
两个 Immutable 对象比较
- 两个 Immutable 可以使用 '===' 进行比较,比较内存。但即使两个对象的值是一样的,也会返回
false
。因此可以使用Immutable.is(map1,map2)
进行比较 -
Immutable.is
比较的是两个对象的hashCode
或者valueOf
区别
-
Object.freeze
和const,都可以达到对象被篡改的功能,但他们是浅拷贝。 - 使用
freeze
后,冻结对象的属性对应一个对象,该对象依旧可以改变。 - 使用
const
则是不允许直接改变对象,但是改变对象的属性是可以的
Cursor概念
当数据嵌套非常深,为了便于访问深层数据,Cursor提供了可以直接访问深层数据的引用
// 需要引入 immutable 和 cursor
let data = Immutable.fromJS({a:{b:{c:1}}});
let cursor = Cursor.from(data,['a','b'],newData => {
// 当 cursor 或者其他 cursor 执行update时调用
console.log(newData);
})
cursor.get('c'); // 1
cursor = cursor.update('c',x => x + 1);
cursor.get('c'); // 2