具有直接属性访问的不可变javascript
Immutable javascript with direct property access
我在一组包含对象的props的React组件中实现了Immutable.js,其中Immutable以前没有使用过。
当我重写所有{someProp。到{someProp.get(" someevalue ")}(因为不可变的不具有直接访问的道具),我只是想知道是否有可能有对象属性直接访问,而对象仍然是不可变的。
我猜原因是,如果他们直接访问,他们将是可变的,因为这就是javascript对象的工作方式。然而,是否不可能冻结对象(当然在支持它的浏览器中),并且仍然有变化的方法(。set, .map等)创建副本,而不是改变对象本身的方式不可变的工作?
这在技术上是可能的吗?是否有任何库已经做了类似的事情?
"技术上可行吗?"
是的,你描述的实现可以解决这个特殊的问题,但是不可变不仅仅是提供你不允许直接改变的数据结构:
Immutable
提供了持久不可变的List
、Stack
、Map
、OrderedMap
、Set
、OrderedSet
和Record
。它们在现代JavaScript vm上非常高效,通过使用Clojure和Scala流行的哈希映射尝试和向量尝试的结构共享,最大限度地减少了复制或缓存数据的需求。
Immutable
还提供了一个延迟的Seq
, 允许像map
和filter
这样的收集方法的有效链接,而不需要创建中间表示。用Range
和Repeat
创建一些Seq
。
我特别强调。
所以,如果你有大量嵌套的不可变映射和列表,并且你改变了一个元素(也就是说:你创建了一个新的结构,其中大部分数据相同,但有一个项目不同),immutable将能够在两个数据结构之间共享大量数据,使操作更快,消耗更少的内存。
然而,这意味着someValue
值不一定存储在数据结构的顶部,等待您访问它;不可变必须深入到内部为您找到它,因此需要get
。
我怀疑你可以使用符号(隐藏底层数据结构)和代理(拦截属性访问器)创建一个非常酷和友好的API,但是浏览器几乎不支持。
"有没有库已经做了这样的事情?"
目前我能想到的最接近的东西是React的不可变助手。为了支持广泛的操作,更新语法有点嘈杂,但是您从另一端得到的是普通的JavaScript对象和数组。
在JavaScript中处理不可变数据比在为它设计的语言(如Clojure)中要困难得多。然而,我们提供了一个简单的不变性助手
update()
,它使处理这种类型的数据变得更加容易,无需从根本上改变数据的表示方式
的帮助器假定传入的对象是隐式不可变的,但是没有理由不将它们深度冻结。
- JavaScript Array unshift() 以一种不可变的方式
- javascript中不可变的值
- Undersatnding JavaScript 不可变变量和垃圾收集器
- JavaScript 中的数字是不可变的吗?
- 如何在 React/Javascript 中的不可变树中存储指向嵌套节点的“指针”
- 如何使用不可变的 JavaScript 模拟状态
- javascript:File 对象是不可变的
- 涉及不可变属性的Javascript缩小逻辑
- 文本输入不会变成可变javascript
- 在现代javascript中实现enum作为不可变类(es2015)
- 如何在Javascript中使用共享的、不可变的引用类型来跟踪更改
- 对象包装在JavaScript中是不可变的
- 我们可以在Javascript中修改不可变对象的方法吗?
- 具有直接属性访问的不可变javascript
- Javascript数字-不可变
- javascript中的不可变类型
- 理解Javascript不可变变量
- 雄辩JavaScript:不可变的字符串值
- 如何在JavaScript不可变对象的函数转换中处理if/else以便调试
- 如何在JavaScript中创建一个高性能、不可变的数组