问题标签 [weakmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
600 浏览

javascript - 如何在 Javascript 中观察 WeakMap 的垃圾收集?

我的理解WeakMap是“对集合中对象的引用被弱保存。如果没有对存储在 WeakMap 中的对象的其他引用,它们可以被垃圾收集。”

为什么在删除引用后,WeakMap 中仍会出现以下键/值对?WeakMap 不应该为空吗?

0 投票
1 回答
440 浏览

javascript - 真正的弱引用事件发射器/调度器:有可能吗?

我想知道在 JS 技术的当前发展水平下,是否可以在 JS 中实现真正的弱引用事件调度器/发射器机制?

昨天我采用了一个非常流行的 eventemitter3 库,并对其进行了一些更改,以使用 Wea​​kMap 来保存对侦听器的引用。但是今天早上,我意识到实际上它不会像以前在 AS 3.0 中那样工作(嘿,FLASH 粉丝!),因为只要调度程序本身存在,对侦听器的引用就会存在.

非常感谢任何帮助!

PS:任何,我的意思是,非常感谢ANT帮助。如果有人解释为什么这在今天在技术上是不可能的,那么它与提供关于弱引用事件调度器机制的可能实现的线索一样有价值。

0 投票
1 回答
75 浏览

javascript - 在weakmaps中设置新值时我们会改变状态吗?

假设我们有以下代码:

在此示例中,我们尝试使用弱图向最终用户隐藏一些信息。根据调用的方法,我们更改两个弱图中的值。当我们重新分配变量时,我们改变了状态。

编辑:


作为最佳实践,我们不应该在 JS 中改变对象或更改状态

但是,在更新弱图中的值时,我们不会像在变量的情况下那样改变状态吗?使用需要可重写的私有道具时,“最佳实践”是什么?

任何澄清都非常感谢!

0 投票
1 回答
227 浏览

javascript - 带有 WeakMap 的 JavaScript 中的多个私有属性

我想将我的类属性设置为私有,所以我使用了 WeakMap,但使用了一个 WeakMap。创建项目后,我只得到最后一个对象数据,以前的数据被删除......

这是我的代码定义:

在这里,我创建了一个包含所有项目的数组:

这些物品制作精良,我得到:

但是当我迭代我的项目时,我得到:

这是一个活生生的例子:https ://plnkr.co/edit/pFCOcCVl1AQEJqSKvfVX

同样关闭它也不起作用:

0 投票
0 回答
42 浏览

javascript - JavaScript:如果在多个 WeakMap 中使用单个对象作为 key,会阻止垃圾回收吗?

我有一个存储编辑器内容的令牌列表。列表中的每个节点都有一个 dom 节点的映射。为什么是地图?因为相同的文本块可能出现在页面的多个位置,我希望所有实例通过相同的数据结构保持同步。

在这些 dom 节点的映射中,我想使用容器 dom 节点作为双向链表每个节点上 WeakMap 中的键,其中值是该列表节点令牌的 dom 节点。这样,如果从 dom(和容器注册表)中清除编辑器的实例,则列表将丢失对各个令牌节点的所有引用,而无需遍历列表以手动删除映射中的引用。

这是我正在谈论的玩具示例:

https://jsfiddle.net/ujs6vpfq/3/

我的问题是,如果我在多个 WeakMaps 中使用同一个 dom 容器节点作为键,那会构成多个引用并防止垃圾收集吗?我知道没有办法对此进行测试,因为无法询问 WeakMaps 以找到它们所持有的值。

0 投票
2 回答
310 浏览

javascript - 为什么 WeakRef polyfills 是用 Wea​​kMap 制作的?我不明白这怎么行

如果您查看这两个polyfill示例,WeakRef它们都使用WeakMap.

但我不明白这是怎么回事。AWeakMap不持有对其values的弱引用,而是对其keys。并且这两个 polyfill 都this用作键。这意味着如果我说let weakRef = new WeakRef(targetObject)targetObject除非我扔掉,否则永远不会收集垃圾weakRef。这否定了 的全部目的WeakRef,不是吗?

在我有限的实验中,我的理论似乎是正确的。看看这个jsfiddle

此外,有谁知道确实WeakRef有效的polyfill吗?

0 投票
1 回答
25 浏览

javascript - 相同的键 WeakMaps 是否阻塞?

所以 WeakMap 在键上是弱的......如果我有两个 WeakMap,它们都将 DOM 元素存储为具有一些不同值的键。让我们假设,我们不能将它们结合起来......

如果我们要从 DOM 中删除 DOM 元素,那意味着在某些时候,(键,值)对将从 WeakMap 中删除,对吧?

如果有两个 WeakMap,这仍然有效吗?还是他们阻止对方移除它?

0 投票
1 回答
56 浏览

javascript - 带有 event.target 的 WeakMap

编辑:结果证明第二个片段(我的真实代码)实际上没有任何问题。在一个页面上它有效,而在另一个页面上它没有。是的,对于潜在的错误。

我正在创建一个 DOM 元素并将该 DOM 元素作为键提供给 WeakMap。然后,使用 JQuery 事件委托/事件侦听器,我试图检索保存的密钥,但它返回未定义:

任何人都知道为没有 ID 的 DOM 元素保存数据的问题或替代方法吗?

编辑:我有点恼火,我做的例子有效,但我自己的代码没有......(有些位看起来多余。这是根据我的实际代码建模的,所以并不是所有丢失的部分都在这里,只是务实)但是这是显然有效的代码:

0 投票
1 回答
20 浏览

javascript - 如何更新 WeakMap 中现有键的值?

我在 MDN 上找不到任何示例。我想出了这个,

这种方式是否正确,还是在执行此操作之前我应该​​先删除密钥?

0 投票
1 回答
65 浏览

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

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

我遇到了这样写的代码:

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

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

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

我正在看这个视频学习。

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

带数据的弱映射

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

没有数据的弱地图

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