#1是否缺少.size属性的解决方法?

在JavaScript中,我以前从未使用过WeakSetWeakMap,而且我对垃圾回收的了解也不多(我是PHP + JS开发人员,所以这是我第一次确实需要考虑垃圾回收)。但是我认为我现在有一个很好的WeakMap用例。所以我至少想开始尝试它。

我想在实验中确认的主要事情是,对象在被垃圾回收后会自动删除。如果我仅可以访问实例上的WeakSet.size / WeakMap.size属性以检查其大小,但是在“弱”版本中不存在它们,这将很容易测试。

如果可能的话,我猜结果可能会有所不同,因为大小取决于垃圾收集器是否已运行。但这没关系,因为这些实验代码都不会在生产中使用...我只想确认我确实了解垃圾回收和WeakSet / WeakMap的工作方式。使用此功能而无法进行测试(因此无法完全理解)的想法使我感到非常不安,并且我担心当内存泄漏(在生产中)为时过晚时,我最终会发现内存泄漏。

是否有任何变通办法或替代方法来解决WeakSet.sizeWeakMap.size的缺乏……至少仅出于调试/测试/学习的目的?

如果不是.size解决方法,也许是否可以检查WeakMap集合实例的内存使用情况?那将是有用的,因为这是主要关注的地方。

我现在唯一能想到的就是检查整个Node.js进程的内存...在我看来这并不是很可靠。

#2。 .length有什么用?

我也对为什么在.lengthWeakSet的类构造函数/实例原型上有一个WeakMap属性(而不是在它们的实例上)感到有些困惑。

根据:


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap


...两个页面都说.length是:


The value of the length property is 0.


从字面上看,它们始终是硬编码为数字0吗?有什么意义呢?

在Google上搜索“ WeakSet.length”或“ WeakMap.length”(包括精确结果的双引号)不会产生进一步的信息,每个信息只有大约20个结果,它们只是MDN页面的镜像。

最佳答案

该大小对于WeakSetWeakMap均不可用,因为它们的键只是对象的引用,而这些键由垃圾收集器处理。由于收集器无法手动控制(或不应该手动控制),因此一旦不再引用这些对象,它将在运行时的任何时候释放它们的内存。您建议采用一种解决方法来查看其当前大小,这种解决方法既无效也不建议考虑。

length在那里,因为WeakSetWeakMap都是通过原型原型创建的。鉴于收集器将如何随时清除对象引用,

至于使用它们的实验,您可以在Chrome中试用它们并公开垃圾收集器(并手动调用它),以查看丢失对象引用后WeakMap如何清除自身(在this答案中进行了解释)。否则,由于devtools通常会阻止垃圾收集器运行,因此您仍可能在WeakMapWeakSet中看到该引用。

关于javascript - 当.size不存在时,尝试从Node.js中的WeakSet/WeakMap(通过垃圾收集)中自动删除的项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59693585/

10-09 21:23