Map和WeakMap的区别

114 阅读1分钟

我的例子写的不太好,没有办法直观的看到是否释放。

  • 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的区别
  1. WeakMap没有.size()属性,因为WeakMap里面的属性数量可能会随着垃圾回收而发生改变。
  2. WeakMap不能遍历。
  3. WeakMap的属性名称只能是对象,但是Map不局限于对象。
  4. WeakMap没有.clear()方法。