我正在查看 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 等方法的决定背后的动机。
最佳答案
注意它是如何返回一个新对象的:
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!!!
希望对您有所帮助。
关于javascript - 为什么不可变不会提示尝试改变值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37871208/