具有直接属性访问的不可变javascript

Immutable javascript with direct property access

本文关键字:不可变 javascript 访问 属性      更新时间:2023-09-26

我在一组包含对象的props的React组件中实现了Immutable.js,其中Immutable以前没有使用过。

当我重写所有{someProp。{someProp.get(" someevalue ")}(因为不可变的不具有直接访问的道具),我只是想知道是否有可能有对象属性直接访问,而对象仍然是不可变的。

我猜原因是,如果他们直接访问,他们将是可变的,因为这就是javascript对象的工作方式。然而,是否不可能冻结对象(当然在支持它的浏览器中),并且仍然有变化的方法(。set, .map等)创建副本,而不是改变对象本身的方式不可变的工作?

这在技术上是可能的吗?是否有任何库已经做了类似的事情?

"技术上可行吗?"

是的,你描述的实现可以解决这个特殊的问题,但是不可变不仅仅是提供你不允许直接改变的数据结构:

Immutable提供了持久不可变的ListStackMapOrderedMapSetOrderedSetRecord。它们在现代JavaScript vm上非常高效,通过使用Clojure和Scala流行的哈希映射尝试和向量尝试的结构共享,最大限度地减少了复制或缓存数据的需求

Immutable还提供了一个延迟的Seq允许像mapfilter这样的收集方法的有效链接,而不需要创建中间表示。RangeRepeat创建一些Seq

我特别强调。

所以,如果你有大量嵌套的不可变映射和列表,并且你改变了一个元素(也就是说:你创建了一个新的结构,其中大部分数据相同,但有一个项目不同),immutable将能够在两个数据结构之间共享大量数据,使操作更快,消耗更少的内存。

然而,这意味着someValue值不一定存储在数据结构的顶部,等待您访问它;不可变必须深入到内部为您找到它,因此需要get

我怀疑你可以使用符号(隐藏底层数据结构)和代理(拦截属性访问器)创建一个非常酷和友好的API,但是浏览器几乎不支持。


"有没有库已经做了这样的事情?"

目前我能想到的最接近的东西是React的不可变助手。为了支持广泛的操作,更新语法有点嘈杂,但是您从另一端得到的是普通的JavaScript对象和数组。

在JavaScript中处理不可变数据比在为它设计的语言(如Clojure)中要困难得多。然而,我们提供了一个简单的不变性助手update(),它使处理这种类型的数据变得更加容易,无需从根本上改变数据的表示方式

的帮助器假定传入的对象是隐式不可变的,但是没有理由不将它们深度冻结。