WeakMap 键必须是对象,而不是原始值。
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // works fine (object key)
// can't use a string as the key
weakMap.set("test", "Not ok"); // Error, because "test" is not an object
为什么????
让我们看看下面的例子。
let user = { name: "User" };
let map = new Map();
map.set(user, "...");
user = null; // overwrite the reference
// 'user' is stored inside the map,
// We can get it by using map.keys()
如果我们在常规Map 中使用一个对象作为键,那么当
Map 存在,该对象也存在。它占用内存并且可能
不会被垃圾回收。
WeakMap 在这方面有着根本的不同。它没有
防止关键对象的垃圾回收。
let user = { name: "User" };
let weakMap = new WeakMap();
weakMap.set(user, "...");
user = null; // overwrite the reference
// 'user' is removed from memory!
如果我们使用一个对象作为其中的键,并且没有其他对象
对该对象的引用——它将从内存中删除(并从
地图)自动。
WeakMap 不支持迭代和方法keys()、values()、entries(),因此无法从中获取所有键或值。
WeakMap 只有以下方法:
- weakMap.get(key)
- weakMap.set(key, value)
- weakMap.delete(key)
- weakMap.has(key)
这很明显,好像一个对象已经丢失了所有其他引用(如上面代码中的“用户”),然后它会自动被垃圾收集。但从技术上讲,并没有准确说明清理发生的时间。
JavaScript 引擎决定了这一点。它可以选择立即执行内存清理,或者在发生更多删除时等待并稍后执行清理。因此,从技术上讲,WeakMap 的当前元素计数是未知的。引擎可能已经清理或没有清理或部分清理。因此,不支持访问所有键/值的方法。
注意:- WeakMap 的主要应用领域是额外的数据存储。就像缓存一个对象,直到该对象被垃圾收集。