不可变数据

ClojureScript 中默认采用不可变数据作为底层实现.

cljs 当中实现了 Persistent Data Structure,
虽然是不可变数据, 但创建新数据一般会进行结构复用,
也就是说, 比如下面这个例子, b 在内部实现中就可以复用 a 的某些部分

  1. (def a {:a 1 :b 2})
  2. ; #'cljs.user/a
  3. (assoc a :c 3)
  4. ; {:a 1, :b 2, :c 3}
  5. a
  6. ; {:a 1, :b 2}

比如 Vector 的实现, 底层是一棵树, 通常在操作时能做到结构共享从而做到内存和性能的优化.
具体可以参考文章:
part 1
part 2
part 3

比如 List 的实现, 实际是单链表.

关于 HashMap HashSet 等其他的数据结构还需要查阅更多文档…

有兴趣可以顺着链接继续翻不可变数据.