【问题标题】:WeakMap showing different results for same codeWeakMap 显示相同代码的不同结果
【发布时间】:2021-07-01 19:18:50
【问题描述】:

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

我遇到了这样写的代码:

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

注意:请在运行 sn-p 后查看控制台。

大多数时候,当我运行此代码时,我会在weakMap 中获取键x。

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

我正在看这个video 学习。

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

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

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

【问题讨论】:

  • 一旦您的代码离开外部块,x 就有资格进行垃圾回收。它是否还在weakMap 中取决于GC 是否已经清理了它。 GC 何时到达它是不确定的。你永远不应该依赖 GC 时间来做任何事情。如果你把一些东西放在一个weakMap中,你是说一旦它符合垃圾回收的条件,它可能会也可能不会仍然在weakMap中。他们就是这样工作的。如果它不符合 GC 条件,因为其他人对它有完整的引用,那么它将保留在 weakMap 中。
  • 仅供参考,除了console.log(),无论如何你都要迭代weakMap的全部内容。您只能使用.has().get() 方法检查特定项目是否在地图中。一旦一个项目符合 GC 条件,它是否仍然在 weakMap 中可用是一个竞争条件。它会在某个时候消失,但不确定它何时消失。当您希望只有在没有被垃圾回收时才能查找某些内容时,您可以使用 weakMap。
  • @jfriend00 你在考虑弱引用。 WeakMap 不能与用户名(字符串)一起用作键。

标签: javascript ecmascript-6 garbage-collection weakmap


【解决方案1】:

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

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

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
相关资源
最近更新 更多