Javascript 显示相同代码的不同结果的WeakMap
我正在学习weakmap、weakset和weakRefs的用例 我遇到了这样一个代码: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行时 如果垃圾收集器在您单击之
{
常数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吗?用例是什么?我从未发现自己处于这样一种情况下,它会有所帮助,但您可以阅读: