首先要知道,在JS回收机制,当堆栈不再被引用的时候,浏览器内核会自动回收这个数据
当使用map的时候会触发一个垃圾回收机制的问题
首先Map是一种键值对的集合,其中的键和值可以是任意类型的。与对象类似,它们可以通过键来访问值。不同之处在于,Map可以使用任意类型作为键,而对象只能使用字符串或Symbol类型作为键。Map还提供了许多有用的方法,例如size属性来获取键值对的数量,以及forEach()方法来遍历集合。
Map里面如果存在一个对象,当这个对象被删除的时候,实际上在浏览器的堆里它并不会被删除,因为它还被map引用着,这个时候后续如果对这个对象进行操作就有可能出现内存泄露问题
这里就要说到我们的weakMap:
WeakMap 是一种数据结构,它与 Map 类似,但是它存储的是键值对,其中键是对象类型,而值是任意类型。与 Map 不同的是,WeakMap 的键是弱引用,这意味着如果没有其他变量引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。
使用 WeakMap 的主要原因是在某些情况下,我们希望存储一些与对象相关的信息,但是又不希望这些信息阻止垃圾回收机制回收对象所占用的内存。
weakMap自身的方法也比map少了许多,我们来做个对比


weakmap的原型上没有Symbol(Symbol.iterator)这个原始方法,这个方法的主要作用是为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用
const iterable1 = {};
iterable1[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
console.log([...iterable1]);
// Expected output: Array [1, 2, 3]
所以说weakmap是不可迭代的,只能进行一些“增删改查”的操作
不可遍历的主要原因是,由于weakmap的项是一种弱引用
当引用对象被删除时
weakmap中的引用也会被删除,所以weakmap不可遍历