1

我正在学习weakMaps、weakSets 和weakRefs 的用例。

我遇到了这样写的代码:

{
  const x = {
   a: [1, 2]
  };
  var weakMap = new WeakMap();
  weakMap.set(x, 'something');
}
console.log(weakMap);

注意:请在运行代码段后查看控制台。

大多数情况下,当我运行这段代码时,我会在weakMap 中获取密钥x。

但是有几次,当我使用相同的代码时,我注意到了weakMap。背后的原因是什么?

我正在看这个视频学习。

WeakMap 中包含上述 JS 代码(Codepen)的数据。

带数据的弱映射

上面的 JS 代码中没有数据的 WeakMap(JSFiddle,我只能在 JSFiddle 内重现一次)。

没有数据的弱地图

垃圾收集是不可预测的吗?我想知道您是否曾经在实际编码中使用过weakSet、weakMap 或WeakRef。你是在什么情况下使用的?

4

1 回答 1

1

区别取决于垃圾收集器运行的时间与您在控制台中单击 WeakMap 项目以展开它的时间。请仔细注意那里的警告:

在此处输入图像描述

控制台显示的存在于 WeakMap 中的项目是在您单击时出现在其中的项目,而不是在console.log线路运行时。

如果垃圾收集器在您单击之前运行,则该x对象将被 GC,并且 WeakMap 将显示为空。

如果在您单击之前没有运行垃圾收集器,则该x对象将不会被 GC,并且 WeakMap 将显示为已填充。

垃圾收集是不可预测的吗?

一般来说,是的。最好不要依赖它。

于 2021-04-06T00:31:20.437 回答