给定以下琐碎代码:
const Immutable = require('immutable');
const a = Immutable.fromJS({
a: 1,
b: [2, 3, 4],
c: {
d: 1
}
});
const b = a.setIn(['c', 'd'], "Something else");
const c = b.setIn(['c', 'd'], 1);
console.log(a.equals(b)); // true
console.log(Immutable.is(a, c)); // true
console.log(a === c); // false?对于最后的比较,我希望它返回true,因为我将路径['c', 'd']设置为其他东西,然后返回到原始值,而通过结构共享,我希望它会导致c保存对原始数据结构的引用?
我不明白这是怎么回事吗?
发布于 2019-01-20 00:33:34
首先,这个console.log(a.equals(b));实际上返回false:
现在,关于您的问题,如Immutable.js 这里在“非op优化返回自我”一章中所描述的:
在可能的情况下,Immutable.js避免为未发生值更改的更新创建新对象,从而允许进行有效的引用相等检查,以快速确定是否没有发生更改。
下面就是这个例子:
const { Map } = require('immutable');
const originalMap = Map({ a: 1, b: 2, c: 3 });
const updatedMap = originalMap.set('b', 2);
updatedMap === originalMap; // No-op .set() returned the original reference.但是,确实导致更改的更新将返回一个新的引用。这些操作中的每一个都是独立进行的,因此两个类似的更新不会返回相同的引用:
这个例子是:
const { Map } = require('immutable');
const originalMap = Map({ a: 1, b: 2, c: 3 });
const updatedMap = originalMap.set('b', 1000);
// New instance, leaving the original immutable.
updatedMap !== originalMap;
const anotherUpdatedMap = originalMap.set('b', 1000);
// Despite both the results of the same operation, each created a new reference.
anotherUpdatedMap !== updatedMap;
// However the two are value equal.
anotherUpdatedMap.equals(updatedMap);由于要更改该值,setIn将返回一个新的引用。因此,它们在参考上并不相等。
希望我有所帮助:)
https://stackoverflow.com/questions/54272331
复制相似问题