我一直在测试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' }
答案 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();