给出以下简单代码:
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
是否拥有对原始数据结构的引用?
我误会了它的工作原理吗?
答案 0 :(得分:2)
首先,这个console.log(a.equals(b));
实际上返回false:
现在,您的问题已在Immutable.js here中的“无操作优化时返回自我”子章节中记录:
如果可能,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
将返回一个新引用。因此,它们通过引用并不相等。
希望我能帮助:)