【问题标题】:When would you use a Map over a WeakMap when you have objects as keys? [closed]当你有对象作为键时,你什么时候会在 WeakMap 上使用 Map? [关闭]
【发布时间】:2016-10-02 10:34:37
【问题描述】:

有几次我在地图中使用对象作为键,我这样做是为了存储有关该特定对象的元数据。我一直为此使用WeakMap,因为当它用作键的对象被垃圾收集时,映射中的条目被自动垃圾收集的好处。

存储元数据是我能想到的将对象作为映射中键的唯一用例,但我很好奇是否还有其他对象作为键的用例,如果在这些情况下,您会使用常规的 @987654325 @超过WeakMap

【问题讨论】:

  • @Bergi 我不认为这是两者的重复,因为我知道 Map 和 WeakMap 之间的区别,并且我在问题本身中声明了 WeakMap 的使用。更重要的是要知道何时使用 Map 而不是 WeakMap,实际上并没有像相反的那样(使用 Wea​​kMap 而不是 Map)涵盖那么多。
  • 看看WeakMaps的限制就知道了。例如,它们不可迭代 - 所以如果你需要它,你会想要一个 Map
  • 考虑为图建模的实现。让我们假设图的节点可以是用户定义的对象。图实现需要存储这些节点,但也需要将它们与其他数据(例如边(想想邻接“字典”)相关联)。我们需要Map,因为我们还必须能够遍历所有节点(例如networkx.github.io 所做的(在Python 中)和我的JS 端口)。
  • 即使我们不需要遍历节点,如果没有其他对它们的引用,我们可能也不希望它们被垃圾收集,因为这会默默地破坏图形。

标签: javascript dictionary ecmascript-6 weakmap


【解决方案1】:

考虑对图形进行建模的实现。让我们假设图的节点可以是用户定义的对象。图实现需要存储这些节点,但也需要将它们与其他数据(例如边(想想邻接“字典”)相关联)。我们需要一个 Map,因为我们还必须能够遍历所有节点(例如 networkx.github.io 所做的(在 Python 中)和我的 JS 端口)

即使我们不需要遍历节点,如果没有其他对它们的引用,我们可能也不希望它们被垃圾回收,因为那样会默默地破坏图。

- 菲利克斯·克林

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2015-11-07
    • 2010-09-24
    • 2012-08-02
    相关资源
    最近更新 更多