我一直在测试Immutable.js,下面的代码为不可变地图中的对象设置了一个键。在将键设置为该对象后,原始对象将发生变异。通过运行下面的代码可以看到,当从Immutable.js映射获取对象并记录它时,Immutable.js映射中的对象引用的是原始的变异对象。
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' }发布于 2018-04-15 03:45:00
将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();https://stackoverflow.com/questions/49838258
复制相似问题