个人总结:
map对key强引用,当map引用了一个key的时候,(内存堆空间的)实际key内容不会被垃圾回收掉。 (有内存泄漏风险)
weakmap对key弱引用,实际的key可能在某次垃圾回收操作时被清除掉,导致weakmap中的这对key-value也会消失掉。
引用计数:https://zh.wikipedia.org/wiki/%E5%BC%95%E7%94%A8%E8%AE%A1%E6%95%B0
只要存在计数,就不会被垃圾回收机制回收。
强引用:引用并计数
只要引用存在,垃圾回收器永远不会回收。
弱引用:只引用 不计数
会垃圾回收机制回收。
强引用与弱引用本质是两种不同的指针
在Chrome中跑下面代码:
var map = new Map();
{
let x = {}
map.set(x, 'something');
}
console.log(map);
map是在{}这样的一个scope中定义的,scope结束后x应该被垃圾回收掉,但是map强引用了x ,所以x不会被辣鸡回收机制回收,所以这里是可以打印出map的。
var map = new WeakMap();
{
let x = {}
map.set(x, 'something');
}
console.log(map);
WeakMap对x属于弱引用,只有引用,没有计数,当经过{}语句块时垃圾回收判断没有计数了,于是删除掉了x,所以这里打印出的map中长度是0。
以上只在Chrome浏览器控制台第一次运行有效 因为垃圾回收会受有自定的引擎优化算法影响 在Edge下试了几次都保证有效 ( Microsoft Edge 42.17134.1.0 )