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();