【发布时间】:2016-10-02 10:34:37
【问题描述】:
有几次我在地图中使用对象作为键,我这样做是为了存储有关该特定对象的元数据。我一直为此使用WeakMap,因为当它用作键的对象被垃圾收集时,映射中的条目被自动垃圾收集的好处。
存储元数据是我能想到的将对象作为映射中键的唯一用例,但我很好奇是否还有其他对象作为键的用例,如果在这些情况下,您会使用常规的 @987654325 @超过WeakMap。
【问题讨论】:
-
@Bergi 我不认为这是两者的重复,因为我知道 Map 和 WeakMap 之间的区别,并且我在问题本身中声明了 WeakMap 的使用。更重要的是要知道何时使用 Map 而不是 WeakMap,实际上并没有像相反的那样(使用 WeakMap 而不是 Map)涵盖那么多。
-
看看WeakMaps的限制就知道了。例如,它们不可迭代 - 所以如果你需要它,你会想要一个
Map。 -
考虑为图建模的实现。让我们假设图的节点可以是用户定义的对象。图实现需要存储这些节点,但也需要将它们与其他数据(例如边(想想邻接“字典”)相关联)。我们需要
Map,因为我们还必须能够遍历所有节点(例如networkx.github.io 所做的(在Python 中)和我的JS 端口)。 -
即使我们不需要遍历节点,如果没有其他对它们的引用,我们可能也不希望它们被垃圾收集,因为这会默默地破坏图形。
标签: javascript dictionary ecmascript-6 weakmap