我的例子写的不太好,没有办法直观的看到是否释放。
- Map
使用过程中可能会造成内存泄漏。
var map = new Map();
{
let x = {} //x是在代码块中,在代码块之外便会**应该**释放
map.set(x, 'something'); //给map添加x的属性。因为Map是强引用,x在代码块之外并不会释放
}
console.log(map)) //Map(1) {{...} => "something"} 此时x不会被垃圾回收机制回收,因为Map是强引用
-
WeakMap
WeakMap的设计目的在于,键名是对象的弱引用(垃圾回收机制不将该引用考虑在内),所以其所对应的对象可能会被自动回收。当对象被回收后,WeakMap自动移除对应的键值对。可以避免内存泄漏。
var map = new WeakMap();
{
let x = {} //x是在代码块中,在代码块之外便会被释放
map.set(x, 'something'); //给map添加x的属性。因为WeakMap是弱引用,当x释放掉的时候,WeakMap会直接删除这个属性
}
console.log(map)) //Map {{...} => "something"} 此时x会被垃圾回收机制回收
- Map和WeakMap的区别
- WeakMap没有.size()属性,因为WeakMap里面的属性数量可能会随着垃圾回收而发生改变。
- WeakMap不能遍历。
- WeakMap的属性名称只能是对象,但是Map不局限于对象。
- WeakMap没有.clear()方法。