首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Immutable.js参考等式

Immutable.js参考等式
EN

Stack Overflow用户
提问于 2019-01-19 23:44:25
回答 1查看 702关注 0票数 2

给定以下琐碎代码:

代码语言:javascript
复制
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保存对原始数据结构的引用?

我不明白这是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-20 00:33:34

首先,这个console.log(a.equals(b));实际上返回false:

现在,关于您的问题,如Immutable.js 这里在“非op优化返回自我”一章中所描述的:

在可能的情况下,Immutable.js避免为未发生值更改的更新创建新对象,从而允许进行有效的引用相等检查,以快速确定是否没有发生更改。

下面就是这个例子:

代码语言:javascript
复制
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.

但是,确实导致更改的更新将返回一个新的引用。这些操作中的每一个都是独立进行的,因此两个类似的更新不会返回相同的引用:

这个例子是:

代码语言:javascript
复制
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将返回一个新的引用。因此,它们在参考上并不相等。

希望我有所帮助:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54272331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档