Javascript 当.size不';不存在?

Javascript 当.size不';不存在?,javascript,node.js,garbage-collection,weak-references,weakmap,Javascript,Node.js,Garbage Collection,Weak References,Weakmap,#1。缺少.size属性的解决方法? 在JavaScript中,我以前从未使用过WeakSet或WeakMap,而且我对垃圾收集的一般知识不太了解(我是PHP+JS开发人员,所以这是我第一次真正需要考虑垃圾收集)。但我认为我现在有一个很好的WeakMap用例。所以我想至少开始尝试一下 在我的实验中,我想确认的主要事情是,当对象被垃圾收集后,它们会自动被移除。如果我可以访问实例上的WeakSet.size/WeakMap.size属性来检查它们的大小,这将很容易测试,但它们在“弱”版本上不存在 如

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

在JavaScript中,我以前从未使用过
WeakSet
WeakMap
,而且我对垃圾收集的一般知识不太了解(我是PHP+JS开发人员,所以这是我第一次真正需要考虑垃圾收集)。但我认为我现在有一个很好的
WeakMap
用例。所以我想至少开始尝试一下

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

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

是否有任何解决办法或替代方案来解决缺少
WeakSet.size
WeakMap.size
。。。至少是为了调试/测试/学习目的

如果不是
.size
解决方案,是否有办法检查my
WeakMap
集合实例的内存使用情况?这将是同样有用的,因为这是主要的关注点

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

#2。长度是多少?

另外,我有点困惑为什么在
WeakSet
WeakMap
的类构造函数/实例原型上都有
.length
属性(不在它们的实例上)

根据:

…两页都说
.length
是:

  • length属性的值为0。
它们真的只是一直硬编码到数字0吗?这有什么意义


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

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

由于
WeakSet
WeakMap
都是通过原型创建的,因此
length
就存在了。给定收集器如何在任何点清除对象引用

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