状态管理

valtio(React hooks)

https://github.com/pmndrs/valtio/issues/61
无全局干涉的状态共享方案(不需要Provider)。真正的类hooks状态共享库。

JS

WeakMap

WeakMap 的 key 只能是 Object 类型。 原始数据类型 是不能作为 key 的(比如 Symbol)。
WeakSet 则是每一项必须是 Object

Why WeakMap?

在 JavaScript 里,map API 可以通过使其四个 API 方法共用两个数组(一个存放键,一个存放值)来实现。给这种 map 设置值时会同时将键和值添加到这两个数组的末尾。从而使得键和值的索引在两个数组中相对应。当从该 map 取值的时候,需要遍历所有的键,然后使用索引从存储值的数组中检索出相应的值。
但这样的实现会有两个很大的缺点,首先赋值和搜索操作都是 O(n) 的时间复杂度( n 是键值对的个数),因为这两个操作都需要遍历全部整个数组来进行匹配。另外一个缺点是可能会导致内存泄漏,因为数组会一直引用着每个键和值。这种引用使得垃圾回收算法不能回收处理他们,即使没有其他任何引用存在了。
相比之下,原生的 WeakMap 持有的是每个键对象的“弱引用”,这意味着在没有其他引用存在时垃圾回收能正确进行。原生 WeakMap 的结构是特殊且有效的,其用于映射的 key 只有在其没有被回收时才是有效的。
正由于这样的弱引用,WeakMap 的 key 是不可枚举的 (没有方法能给出所有的 key)。如果key 是可枚举的话,其列表将会受垃圾回收机制的影响,从而得到不确定的结果。因此,如果你想要这种类型对象的 key 值的列表,你应该使用 Map
基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。

很好的解释:https://segmentfault.com/a/1190000015774465
强引用,
image.png
强引用除非解除(置为null,或引用别的),不然只要不解除,引用的对象始终不会被垃圾回收。而Map,Set中对Object的引用,就是强引用。
而使用Weak则不是,也就相当于不需要对WeakMap/Set中的 key(或项),做解除操作,如果对该 Object 的引用计数只有当前的 WeakXX,那gc会回收该 Object,反应的效果就是,gc 后 WeakXX 中的引用会自动解除。