immutable.js的简单理解

转载自:https://www.zhihu.com/question/28016223/answer/50154351


首先,它虽然和React同期出现且跟React配合很爽,但它可不是React工具集里的(它的光芒被掩盖了),它是一个完全独立的库,无论基于什么框架都可以用它。意义在于它弥补了Javascript没有不可变数据结构的问题。不可变数据结构是函数式编程中必备的。前端工程师被OOP洗脑太久了,组件根本上就是函数用法,FP的特点更适用于前端开发。

Javascript中对象都是参考类型,也就是a={a:1}; b=a; b.a=10;你发现a.a也变成10了。可变的好处是节省内存或是利用可变性做一些事情,但是,在复杂的开发中它的副作用远比好处大的多。于是才有了浅copy和深copy,就是为了解决这个问题。举个常见例子:

var defaultConfig = { /* 默认值 */};
var config = $.extend({}, defaultConfig, initConfig); // jQuery用法。initConfig是自定义值
var config = $.extend(true, {}, defaultConfig, initConfig); // 如果对象是多层的,就用到deep-copy了

ES6出现原生的assign方法,但它相当于是浅copy。如果有了不可变的数据结构就省心了,ES5.1中对象有了freeze方法,也是浅copy,a=Object.freeze({a:1}); b=a; b.a=10; a.a还是1。在实际开发中浅copy通常不够。如果用immutableJS:

var defaultConfig = Immutable.fromJS({ /* 默认值 */}); 
var config = defaultConfig.merge(initConfig); // defaultConfig不会改变,返回新值给config
var config = defaultConfig.mergeDeep(initConfig); // 深层merge

上述用deep-copy也可以做到,差别在于性能。每次deep-copy都要把整个对象递归的复制一份。而Immutable的实现有些像链表,添加一个新结点把旧结点的父子关系转移到新结点上,性能提升很多,想深挖原理请看这里:Persistent data structure。ImmutableJS给的远不止这些,它提供了7种不可变的数据结构:List, Stack, Map, OrderedMap, Set, OrderedSet, Record (详见文档Immutable.js,文档很geek,打开console试吧)。immutableJS + 原生Javascript等于真正的函数式编程。

遍历对象不再用for-in,可以这样:

Immutable.fromJS({a:1, b:2, c:3}).map(function(value, key) { /* do some thing */});

实现一个map-reduce:

var o = Immutable.fromJS({a:{a:1}, b:{a:2}, c:{a:3}});
o.map(function(e){ return e.get('a'); }).reduce(function(e1, e2){ return e1 + e2; }, 0);

修改藏在深处的值,可以这样:

var o = Immutable.fromJS({a:[{a1:1}, {b:[{t:1}]}, {c1:2}], b:2, c:3});
o = o.setIn(['a', 1, 'b', 0, 't'], 100); // t赋值
o = o.updateIn(['a', 1, 'b', 0, 't'], function(e){ return e * 100; }); // t * 100

比较两个对象是否完全相等: o1.equals(o2)

远不止这些,immutableJS提供了强大的api自己去看吧。由于是不可变的,可以放心的对对象进行任意操作。在React开发中,频繁操作state对象或是store,配合immutableJS快、安全、方便。
Immutable.js是一个JavaScript库,用于创建不可变的数据结构。它提供了一组用于创建、操作和查询这些数据结构的API。以下是使用Immutable.js的一些常见步骤: 1. 安装Immutable.js 可以使用npm或yarn安装Immutable.js: ```bash npm install immutable ``` ```bash yarn add immutable ``` 2. 导入Immutable.js 在需要使用Immutable.js的文件中,导入Immutable.js的核心模块: ```js import Immutable from 'immutable'; ``` 3. 创建不可变的数据结构 使用Immutable.js的函数来创建不可变的数据结构,例如: ```js const data = Immutable.fromJS({ foo: { bar: 1 } }); ``` 这将创建一个不可变的Map对象,其中包含一个名为`foo`的键,它的值是包含一个`bar`键和值为1的对象。 4. 操作不可变的数据结构 使用Immutable.js的方法来对不可变数据结构进行操作,例如: ```js const newData = data.setIn(['foo', 'bar'], 2); ``` 这将返回一个新的Immutable对象,其中`foo.bar`的值已经被更新为2。需要注意的是,原始的数据结构并没有被修改,而是返回了一个新的对象来代表更新后的值。 5. 查询不可变的数据结构 使用Immutable.js的方法来查询不可变数据结构,例如: ```js const value = data.getIn(['foo', 'bar']); ``` 这将返回`foo.bar`的值,即1。 以上就是使用Immutable.js的基本步骤。需要注意的是,由于Immutable.js创建的数据结构是不可变的,因此在对其进行操作时需要使用Immutable.js提供的方法,而不是原生的JavaScript方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值