首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“不变”不抱怨试图更改值

为什么“不变”不抱怨试图更改值
EN

Stack Overflow用户
提问于 2016-06-17 00:04:37
回答 2查看 54关注 0票数 0

我正在查看不变库的文档,对于试图更改不可变集合上的值而忽略操作而不抛出异常这一事实感到非常惊讶。

这是文档中的示例。

代码语言:javascript
复制
import Immutable = require('immutable');
var map1: Immutable.Map<string, number>;
map1 = Immutable.Map({a:1, b:2, c:3});
var map2 = map1.set('b', 50);
map1.get('b'); // 2
map2.get('b'); // 50

为什么它是以这种方式实现的,那么抛出异常从而在代码中公开错误不是更好吗?

更新

我是更多的Java开发人员,我本能地认为JS中不可变集合的行为将类似于java。Java的不可变集合将在试图修改集合时抛出UnsupportedOperationException。

我理解javascript是一种不同的语言,它可以有自己的规则和观点。我并不是说这是错误的,我只是想了解决定允许调用在不变集合上设置/推等方法的动机。

EN

回答 2

Stack Overflow用户

发布于 2016-06-17 00:11:01

但是请注意它是如何返回一个新对象的:

代码语言:javascript
复制
var map2 = map1.set('b', 50);
map1.get('b'); // 2
map2.get('b'); // 50
map1.get('b'); // 2 <--- It's still 2!

我确实同意在某种程度上这是不应该允许的,但是让它这样运行是很方便的,有时您想要一个带键修改的新对象。无论如何,如果这种情况发生,它就会失败:

代码语言:javascript
复制
map1 = Immutable.Map({a:1, b:2, c:3});
map1.get('b'); // 2
var map2 = map1.set('b', 50);
map1.get('b'); // 50 <--- Oh, no!!!

我希望这能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2016-06-17 06:08:28

我认为您是在寻找冻结的对象,但是却发生在不可变对象上,因为它是一个名称对象,具有Java中的不可变集合。不可变的js除了提供本机可变类型的不可变封装之外,还有一个非常不同的用途。它允许简单:p和丰富的结构修改也。这就是这种行为。我认为,如果您感兴趣的只是一个不允许任何修改的冻结对象,请看一下Object.freeze

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

https://stackoverflow.com/questions/37871208

复制
相关文章

相似问题

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