WeakMap 显示相同代码的不同结果

问题描述

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

我遇到了这样写的代码

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

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

大多数时候,当我运行这段代码时,我得到的是weakMap中的键x。

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

我正在观看此 video 以学习。

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

WeakMap with data

WeakMap 上面的 JS 代码没有数据(JSfiddle,我只能在 JSfiddle 中复制一次)。

WeakMap without data

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

解决方法

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

enter image description here

控制台显示的 WeakMap 中存在的项目在您单击时 - 而不是在 console.log 行运行时。

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

如果垃圾收集器在您单击之前没有运行,则 x 对象不会被 GC 处理,并且 WeakMap 会出现填充。

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

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