Javascript 显示相同代码的不同结果的WeakMap

Javascript 显示相同代码的不同结果的WeakMap,javascript,ecmascript-6,garbage-collection,weakmap,Javascript,Ecmascript 6,Garbage Collection,Weakmap,我正在学习weakmap、weakset和weakRefs的用例 我遇到了这样一个代码: { 常数x={ 答:[1,2] }; var weakMap=new weakMap(); weakMap.set(x,“某物”); } console.log(weakMap)区别将取决于垃圾收集器运行的时间与您在控制台中单击WeakMap项以展开它的时间。注意下面的警告: 控制台显示的存在于WeakMap中的项目是您单击时就在其中的项目,而不是运行console.log行时 如果垃圾收集器在您单击之

我正在学习weakmap、weakset和weakRefs的用例

我遇到了这样一个代码:

{
常数x={
答:[1,2]
};
var weakMap=new weakMap();
weakMap.set(x,“某物”);
}

console.log(weakMap)区别将取决于垃圾收集器运行的时间与您在控制台中单击WeakMap项以展开它的时间。注意下面的警告:

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

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

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

垃圾收集是不可预测的吗


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

一旦代码离开外部块,
x
就有资格进行垃圾收集。它是否仍在
weakMap
中取决于GC是否已将其清理干净。GC何时到达它是不确定的。任何事情都不应该依赖GC计时。如果你把某个东西放在一个弱映射中,你的意思是,一旦它符合垃圾收集的条件,它可能在弱映射中,也可能不在弱映射中。他们就是这样工作的。如果它不符合GC的条件,因为其他人有对它的完整引用,那么它将保留在weakMap.FYI中,而不是使用
console.log()
,您仍然可以迭代weakMap的全部内容。您只能使用
.has()
.get()
方法检查特定项目是否在映射中。一旦一个物品符合GC的条件,它就是一个竞赛条件,取决于它是否在weakMap中仍然可用。它会在某个时刻消失,但它何时消失还不确定。当您希望某些内容只有在未被垃圾收集的情况下才能被查找时,才使用weakMap。@jfriend00您考虑的是弱引用。
WeakMap
不能与用户名(字符串)一起用作键。非常感谢。您在现实生活场景中使用过WeakMap吗?用例是什么?我从未发现自己处于这样一种情况下,它会有所帮助,但您可以阅读: