我正在查看Immutable library的文档,并且对于尝试更改不可变集合的值而忽略该操作并且不会抛出异常这一事实感到非常惊讶。
这是文档中的示例
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是一种不同的语言,它可以有自己的规则并查看它应该如何表现。我不是说这是错的我只是想了解决定允许调用set / push etc方法在不可变集合上的动机。
答案 0 :(得分:1)
注意它是如何返回一个新对象的:
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!!!
我希望有所帮助。
答案 1 :(得分:0)
我认为你正在寻找冻结的对象,而是发生在immutable上,因为它与Java中的不可变集合同名。除了在本机可变类型周围提供不可变的封装之外,不可变的js用于非常不同的目的。它允许简单:p和丰富的结构修改。因此这种行为。我想如果您感兴趣的是拥有一个不允许进行任何修改的冻结对象,请查看Object.freeze
。