type
status
date
slug
summary
tags
category
icon
password
之前了解的`Map`和`WeakMap`,只知道`WeakMap`只允许使用对象作为键,而不能是原始值,但却忽略了它还有一个很重要的特性,即它不会阻止垃圾回收机制对作为键的对象(key object)的回收。
为了更好的解释这句话的意思,先看以下代码:
如上,虽说`foo`最后被赋值为`null`,但是并不会被垃圾回收机制回收,原因是`foo`所引用的对象被存储在`array`中,我们仍然可以通过`array[0]`来获取`foo`所引用的对象的值。
同理,如果我们将`foo`作为常规`Map`的键,只要`Map`对象存在,那么`foo`就无法被回收。
这时候`WeakMap`的特性就体现出来了,以上方法如果使用`WeakMap`来做,当设置`foo=null`时,`foo`的引用地址将会被覆盖,同时`WeakMap`对应的键值也会被删除,从而彻底释放`foo`的引用地址,即彻底被回收。
为什么说“weakmap将会是个空值集合”?因为我们无法从技术角度准确知道垃圾回收机制何时将引用地址回收。笔者曾经在`chrome`控制台复现过这样的场景:
可见我们是无法准确知道垃圾回收机制何时回收某个引用地址。如有纰漏,欢迎指正。