Lee byron在视频中提出了这一点,但我似乎找不到他解释这一点的部分。
https://www.youtube.com/watch?v=I7IdS-PbEgI&t=1604s
这是因为当您更新一个节点时,您有遍历日志(n(来到达该节点。具有不可变结构,并且必须复制最坏情况下的n个节点。。。这是我的想法。
如果您想以简单的方式创建一个不可变列表,那么显而易见的解决方案是将整个列表复制到一个新列表中,并交换单个项。所以复制一个更大的列表需要更长的时间,对吧?结果至少是O(n(。
另一方面,Immutable.js使用了一个trie(请参见维基百科(图,它允许重用大部分结构,同时确保现有引用不会发生突变。
简单地说,您创建了一个新的树状结构,并为修改后的零件创建了新的分支。当其中一个分支不变时,树可以直接链接到原始结构,而不是复制。
immutable.js文档从两个指向长描述的链接开始,特别是关于向量尝试的链接很好:
这些数据结构在现代JavaScript虚拟机上通过通过散列映射尝试和向量使用结构共享正如Clojure和Scala推广的那样,尽量减少复制或缓存数据。
如果您想了解更多详细信息,您可能还想看看关于如何实现不可变性的问题。