Immutable.js不复制对象

时间:2018-04-15 03:38:22

标签: javascript immutable.js

我一直在测试Immutable.js,以下代码设置了Immutable Map中对象的键。将密钥设置为对象后,原始对象将发生变异。正如您通过运行下面的代码所看到的,当获取对象并从Immutable.js Map中记录它时,Immutable.js映射中的对象引用了原始的mutated objected。

每次设置新数据时,Immutable.js的目的是不是要返回一个新的不可变副本?我本来期待一个深刻的克隆?

const Immutable = require('immutable');

const testObj = { id: 'a' };
console.log('TEST OBJECT');
console.log(testObj); // { id: 'a' }

const newMap = Immutable.Map();
const newMap2 = newMap.set('a', testObj);
console.log('AFTER INITIAL IMMUTABLE SET');
console.log(newMap2.get('a')); // { id: 'a' }

testObj.id = 'z';
console.log('AFTER MUTATING ID IN TESTOBJ');
console.log(testObj); // { id: 'z' }
console.log(newMap2.get('a')); // { id: 'z' }

1 个答案:

答案 0 :(得分:1)

您要将newMap2.id设置为引用对象testObj,而不是testObj

的值

如果您想将newMap设置为testObj的值,您可以这样做:

const newMap = Immutable.Map({a: Immutable.Map(testObj)); 

或使用fromJS深度克隆(请参阅https://facebook.github.io/immutable-js/docs/#/fromJS

const newMap = Immutable.fromJS({a: testObj)); 

然后使用toJS获取值,如果你想要一个标准的js对象(参见https://facebook.github.io/immutable-js/docs/#/Map/toJS

newMap.get('a').toJS();