Closed. This question is opinion-based。它当前不接受答案。
                        
                    
                
            
        
            
        
                
                    
                
            
                
                    想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                
                    3年前关闭。
            
        

    

我正在查看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/

10-12 00:50