Skip to content
📁 标签
JavaScript

Map和WeakMap的区别

  • Map对键名是强引用,weakMap是弱引用。
  • Map可以被遍历,weakMap不能被遍历
  • Map的键可以是任意类型,weakMap只能是对象作为键名

强引用和弱引用

通常,我们创建一个对象都是建立一个强引用的关系

js
// 当前foo指向一个对象
// 当foo指向null时,浏览器会把foo变量被GC
let foo = {foo:'foo'}

// 过一会 foo会被GC
foo = null

Map对于键是强引用关系

js
let m = new Map();

foo = {
  foo: "foo",
};

// 建立强引用关系
m.set(foo,'foo');

foo = null;

// 由于map对键是强引用关系,map对于原foo内存地址还有引用关系,所以对应的内存地址并没有被回收
setTimeout(() => {
  console.log(m);
  // Map(1) {{…} => 'foo'}
}, 4000);

weakMap对于键是弱引用关系,当对应的键被回收之后,值也自动被清空了

js
let foo = {foo:'foo'}

let wm = new weakMap()

wm.set(foo,'foo');

foo = null;
// 由于weakMap是弱引用关系,foo被垃圾回收之后,wm中foo对应的值也被清除了
setTimeout(() => {
  console.log(wm);
  // WeakMap {}
}, 4000);