npm install immutable
复制代码
immutable 能够基于共享部分对象来建立新的对象 :能够理解为两个对象,相同的地方引用的都是同一部分,是相同的。不一样的地方是不一样的。git
let { Map } = require('immutable');
let m1 = Map({ a: 1, b: 2, c: 3 });
console.log(m1.get('a'));//1
let m2 = m1.set('a', '11');
console.log(m2.get('a'));//11
console.log(m1.get('a'));//1
console.log(m1 === m2);//false
复制代码
let { Map,fromJS } = require('immutable');
let m1 = fromJS({ a: 1, b: { c: 1 } });
let m2 = m1.set('a', 11);
console.log(m1.get('a'));//1
console.log(m2.get('a'));//11
console.log(m1.b === m2.b);//true
let m2 = m1.setIn(['b', 'c'], 'c');//修改多级
let m2 = m1.updateIn(['b', 'c'], val => val + 2);//updateIn,传入一个回调
console.log(m2.getIn(['b', 'c']));//获取多级
复制代码
问题:immutable虽然很强大,但使用与普通js不同,压缩后库仍是比较大的20多k。github
使用Object.defineProperty扩展了 JavaScript的Array和Object对象来实现,只支持 Array 和 Object 两种数据类型npm
let Immutable=require('seamless-immutable');
let objA=Immutable({info: {age: 8}});
let objB=objA.merge({info: {age: 9}});
console.log(objA.info.age);
console.log(objB.info.age);
复制代码
优缺点:用法简单,比较小。可是功能不强大。数组
Immutable优点bash
下降复杂度数据结构
let obj = immutable({ age: 8 });
handle(obj);
console.log(obj.age);//8
function handle(obj) {
obj.age = 100;
}
//无论handle(obj);如何修改,obj.age始终为8
复制代码
节约内存:共享相同部分less
方便回溯:撤销性能
function Map(obj) {
return {
set(key, val) {
let newObj = { ...obj };
newObj[key] = val;
return Map(newObj);
},
get(key) {
return obj[key];
}
}
}
let m1 = Map({ a: 1, b: 2, home: { name: 'beijing' } });
let m2 = m1.set('b', '22');
console.log(m2.get('b'));
复制代码
//Map() 原生object转Map对象 (只会转换第一层,注意和fromJS区别)
immutable.Map({name:'danny', age:18})
//List() 原生array转List对象 (只会转换第一层,注意和fromJS区别)
immutable.List([1,2,3,4,5])
//fromJS() 原生js转immutable对象 (深度转换,会将内部嵌套的对象和数组所有转成immutable)
immutable.fromJS([1,2,3,4,5]) //将原生array --> List
immutable.fromJS({name:'danny', age:18}) //将原生object --> Map
//toJS() immutable对象转原生js (深度转换,会将内部嵌套的Map和List所有转换成原生js)
immutableData.toJS();
//查看List或者map大小
immutableData.size 或者 immutableData.count()
// is() 判断两个immutable对象是否相等
immutable.is(imA, imB);
//merge() 对象合并
var imA = immutable.fromJS({a:1,b:2});
var imA = immutable.fromJS({c:3});
var imC = imA.merge(imB);
console.log(imC.toJS()) //{a:1,b:2,c:3}
//增删改查(全部操做都会返回新的值,不会修改原来值)
var immutableData = immutable.fromJS({
a:1,
b:2,
c:{
d:3
}
});
var data1 = immutableData.get('a') // data1 = 1
var data2 = immutableData.getIn(['c', 'd']) // data2 = 3 getIn用于深层结构访问
var data3 = immutableData.set('a' , 2); // data3中的 a = 2
var data4 = immutableData.setIn(['c', 'd'], 4); //data4中的 d = 4
var data5 = immutableData.update('a',function(x){return x+4}) //data5中的 a = 5
var data6 = immutableData.updateIn(['c', 'd'],function(x){return x+4}) //data6中的 d = 7
var data7 = immutableData.delete('a') //data7中的 a 不存在
var data8 = immutableData.deleteIn(['c', 'd']) //data8中的 d 不存在
复制代码