WeakMap和Map都是由键值对组成的,区别在于,WeakMap的键只能是一个对象。WeakMap中对象类型的键对值的引用不是正式的引用,不会阻止垃圾回收。
WeakMap 和 Map 是弱引用和强引用的区别
强引用
var m = new Map()
function Foo() {
this.arr = new Array(5 * 1024 * 1024)
}
var f = new Foo()
m.set(f, 'data')
弱引用
var wm = new WeakMap()
function Foo() {
this.arr = new Array(5 * 1024 * 1024)
}
var f = new Foo()
wm.set(f, 'data')
图左 Foo 对象由于同时被 f 和 Map 对象所引用,其引用计数为 2,而图右中因为是被 WeakMap 对象引用,是弱引用,不计入引用计数,所以值为 1。
我们断开 f 对 Foo 对象的引用,则 Foo 对象由于引用计数为 0,会被垃圾回收器回收掉。
var wm = new WeakMap()
function Foo() {
this.arr = new Array(5 * 1024 * 1024)
}
var f = new Foo()
wm.set(f, 'data')
f = null
如何验证 WeakMap 起作用了?
一条浏览器中的验证方法:
在 Chrome 浏览器中,我们可以通过开发者工具中的 memory 面板来调试,我们先来调试下 Map:
在控制台执行下面代码
var m = new Map()
function Foo() {
this.arr = new Array(5 * 1024 * 1024)
}
var f = new Foo()
m.set(f, ‘data’)
f = null
点击 memory 面板中的小圆点,记录当前内存快照,搜索 Foo,发现存在一个,可见 Foo 对象没有被回收。
然后再来试一下 WeakMap:
在控制台执行下面代码
var wm = new WeakMap()
function Foo() {
this.arr = new Array(5 * 1024 * 1024)
}
var f = new Foo()
wm.set(f, ‘data’)
f = null
点击 memory 面板中的小圆点,记录当前内存快照,搜索 Foo,发现不存在,可见其已被回收。
作者:Aaaaaaaaaaayou
链接:https://juejin.cn/post/6844904160085671949
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。