Immutable.js参考相等

时间:2019-01-19 23:44:26

标签: immutable.js

给出以下简单代码:

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是否拥有对原始数据结构的引用?

我误会了它的工作原理吗?

1 个答案:

答案 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将返回一个新引用。因此,它们通过引用并不相等。

希望我能帮助:)