Immutable.js 没有复制对象
Immutable.js not copying object
我一直在测试 Immutable.js 并且以下代码为不可变映射中的对象设置了一个键。将键设置为对象后,原始对象发生变异。正如您在下面的 运行 代码中看到的那样,当从 Immutable.js 地图获取对象并记录它时,Immutable.js 地图中的对象引用了原始的变异对象。
Immutable.js的目的不就是每次设置新数据时return一个新的不可变副本吗?我会期待深度克隆吗?
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' }
您正在将 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));
如果你想要一个标准的 js 对象,然后使用 toJS 获取值(参见 https://facebook.github.io/immutable-js/docs/#/Map/toJS)
newMap.get('a').toJS();
我一直在测试 Immutable.js 并且以下代码为不可变映射中的对象设置了一个键。将键设置为对象后,原始对象发生变异。正如您在下面的 运行 代码中看到的那样,当从 Immutable.js 地图获取对象并记录它时,Immutable.js 地图中的对象引用了原始的变异对象。
Immutable.js的目的不就是每次设置新数据时return一个新的不可变副本吗?我会期待深度克隆吗?
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' }
您正在将 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));
如果你想要一个标准的 js 对象,然后使用 toJS 获取值(参见 https://facebook.github.io/immutable-js/docs/#/Map/toJS)
newMap.get('a').toJS();