为什么没有直接访问WeakMap中的项目?当垃圾收集器删除作为WeakMap键的链接时,那么与该键绑定的值也会被删除吗?
答案 0 :(得分:1)
通过“直接访问项目”,我认为你的意思是为什么它们不是可枚举的?这是MDN的解释:
由于引用较弱,WeakMap键不可枚举(即没有方法为您提供键列表)。如果是,那么列表将取决于垃圾收集的状态,引入非确定性。如果您想拥有密钥列表,则应使用
Map
。
我不确定我理解问题的第二部分。如果没有对密钥的非弱引用,则条目(即键值对)有资格从WeakMap
中删除。如果从Map
或从其他任何地方删除该值,则会发生什么情况:如果它是对该值的最后一个非弱引用,则它有资格进行垃圾回收。但是,只要条目(键值对)在WeakMap
中存活,该值就被视为引用,并且不会被垃圾收集。
答案 1 :(得分:0)
WeakMap
的预期功能是允许添加到其中的项目自动进行垃圾收集,如果WeakMap本身是该项目的唯一剩余持有者。这对于保留对某个对象的引用非常有用,而另一个对象存在(通常的用例是实现类 - 私有属性/访问),并且还提供以前在JavaScript中无法实现的安全性 - 如果有,则只能访问该值"键"。
由于WeakMaps的性质,其属性无法直接迭代 - 只有拥有项目密钥才能访问项目。如果密钥不再存在(旧对象),或者如果无法从代码的该部分访问密钥,则无法访问该值。
如果您需要从其他地方访问值或遍历所有值,则应使用Map
。但是,Map不允许对密钥或值进行垃圾回收;必须手动删除项目以释放内存。
有关详细信息,请参阅MDN docs on WeakMaps。将描述部分与Map。
进行比较