我正在查看不变库的文档,对于试图更改不可变集合上的值而忽略操作而不抛出异常这一事实感到非常惊讶。
这是文档中的示例。
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是一种不同的语言,它可以有自己的规则和观点。我并不是说这是错误的,我只是想了解决定允许调用在不变集合上设置/推等方法的动机。
发布于 2016-06-17 00:11:01
但是请注意它是如何返回一个新对象的:
var map2 = map1.set('b', 50);
map1.get('b'); // 2
map2.get('b'); // 50
map1.get('b'); // 2 <--- It's still 2!我确实同意在某种程度上这是不应该允许的,但是让它这样运行是很方便的,有时您想要一个带键修改的新对象。无论如何,如果这种情况发生,它就会失败:
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!!!我希望这能帮上忙。
发布于 2016-06-17 06:08:28
我认为您是在寻找冻结的对象,但是却发生在不可变对象上,因为它是一个名称对象,具有Java中的不可变集合。不可变的js除了提供本机可变类型的不可变封装之外,还有一个非常不同的用途。它允许简单:p和丰富的结构修改也。这就是这种行为。我认为,如果您感兴趣的只是一个不允许任何修改的冻结对象,请看一下Object.freeze。
https://stackoverflow.com/questions/37871208
复制相似问题