#1。缺少.size
属性的解决方法?
[在JavaScript中,我以前从未使用过WeakSet
或WeakMap
,而且我对垃圾回收的了解也不多(我是PHP + JS开发人员,所以这是我第一次确实需要考虑垃圾回收)。但是我认为我现在有WeakMap
的好用例。所以我至少想开始尝试它。
我想在实验中确认的主要事情是,当对象被垃圾回收后会自动将其删除。如果我仅可以访问实例上的WeakSet.size
/ WeakMap.size
属性以检查其大小,但在“弱”版本中不存在它们,这将很容易测试。
[如果可能的话,我猜结果可能会有所不同,因为大小取决于垃圾收集器是否已运行。但这没关系,因为这些实验代码都不会在生产中使用...我只想确认我确实了解垃圾回收和WeakSet / WeakMap的工作方式。使用此功能而不能够进行测试(因此无法完全理解)的想法使我感到非常不安,并且我担心,如果内存泄漏(在生产中)为时已晚,我最终会发现内存泄漏。
是否有任何替代方法或替代方法来解决缺少WeakSet.size
和WeakMap.size
...至少仅出于调试/测试/学习的目的?
如果不是.size
解决方法,也许有一种方法可以检查WeakMap
集合实例的内存使用情况?那将是有用的,因为这是主要关注的地方。
我现在唯一能想到的就是检查整个Node.js进程的内存...在我看来这不是很可靠。
#2。 .length是什么?
[我也对为什么.length
和WeakSet
的类构造函数/实例原型上都具有WeakMap
属性(而不是在您的实例上)感到有些困惑。
根据:
...两页都说.length
是:
The value of the length property is 0.
它们是不是一直都被硬编码为数字0?有什么意义呢?
[在Google上搜索“ WeakSet.length”或“ WeakMap.length”(包括精确结果的双引号)不会产生进一步的信息,每个信息只有大约20个结果,它们只是MDN页面的镜像。
WeakSet
或WeakMap
都无法使用该大小,因为它们的键只是对对象的引用,而这些键由垃圾收集器处理。由于收集器无法手动控制(或不应该手动控制),因此一旦不再引用这些对象,它将在运行时的任何时候释放它们的内存。您建议采用一种解决方法来查看其当前大小,这种解决方法既无效也不建议考虑。
length
在那里,因为WeakSet
和WeakMap
都是通过它们的原型对应对象创建的。鉴于收集器将如何随时清除对象引用,
作为对它们的实验,您可以在Chrome中试用它们并公开垃圾收集器(并手动调用它),以查看丢失对象引用后WeakMap如何清除自身(在this答案中有解释)。否则,您可能仍会在WeakMap
或WeakSet
中看到引用,因为devtools通常会阻止垃圾收集器运行。