访问WeakMap项目

时间:2018-06-12 08:21:24

标签: javascript

为什么没有直接访问WeakMap中的项目?当垃圾收集器删除作为WeakMap键的链接时,那么与该键绑定的值也会被删除吗?

2 个答案:

答案 0 :(得分:1)

通过“直接访问项目”,我认为你的意思是为什么它们不是可枚举的?这是MDN的解释:

  

由于引用较弱,WeakMap键不可枚举(即没有方法为您提供键列表)。如果是,那么列表将取决于垃圾收集的状态,引入非确定性。如果您想拥有密钥列表,则应使用Map

我不确定我理解问题的第二部分。如果没有对密钥的非弱引用,则条目(即键值对)有资格从WeakMap中删除。如果从Map或从其他任何地方删除该值,则会发生什么情况:如果它是对该值的最后一个非弱引用,则它有资格进行垃圾回收。但是,只要条目(键值对)在WeakMap中存活,该值就被视为引用,并且不会被垃圾收集。

答案 1 :(得分:0)

WeakMap的预期功能是允许添加到其中的项目自动进行垃圾收集,如果WeakMap本身是该项目的唯一剩余持有者。这对于保留对某个对象的引用非常有用,而另一个对象存在(通常的用例是实现类 - 私有属性/访问),并且还提供以前在JavaScript中无法实现的安全性 - 如果有,则只能访问该值"键"。

由于WeakMaps的性质,其属性无法直接迭代 - 只有拥有项目密钥才能访问项目。如果密钥不再存在(旧对象),或者如果无法从代码的该部分访问密钥,则无法访问该值。

如果您需要从其他地方访问值或遍历所有值,则应使用Map。但是,Map不允许对密钥或值进行垃圾回收;必须手动删除项目以释放​​内存。

  

有关详细信息,请参阅MDN docs on WeakMaps。将描述部分与Map

进行比较