js中WeakMap 和WeakSet的区别

文章类型:Javascript

发布者:hp

发布时间:2023-05-19

WeakMap 和 WeakSet 是 JavaScript 中的两种集合类型,设计目的是为了解决对象引用导致的内存泄漏问题,并且在对象不再被引用时能够自动进行垃圾回收

一:区别

  1. 键和值的类型上:WeakMap 的键必须是对象,而值可以是任意类型;WeakSet 中存储的是对象的集合,不能存储其他类型的值。
  2. 引用关系上:WeakMap 中的键是弱引用的,当键对象没有其他引用时,垃圾回收机制可以自动回收它们;WeakSet 中存储的对象也是弱引用的,但是如果一个对象只被 WeakSet 引用,而没有其他引用,该对象同样会被垃圾回收。
  3. 遍历能力上:WeakMap 和 WeakSet 都不提供直接的遍历方法,无法使用 forEach、for...of 等迭代器遍历集合中的元素。
  4. 存在性检查上:WeakMap 提供的 has(key) 方法可以检查键是否存在于集合中;WeakSet 提供的 has(value) 方法可以检查值是否存在于集合中。
  5. 数据结构特点上:WeakMap 中的键是无序且唯一的,即同一个键只能出现在 WeakMap 中一次;WeakSet 中的对象也是无序且唯一的,即同一个对象只能出现在 WeakSet 中一次。

二:代码

1:WeakMap

const wm = new WeakMap();

const obj1 = {};
const obj2 = {};

wm.set(obj1, 'value1');
wm.set(obj2, 'value2');

console.log(wm.get(obj1)); // 'value1'
console.log(wm.has(obj2)); // true

wm.delete(obj1);
console.log(wm.has(obj1)); // false

2:WeakSet

const ws = new WeakSet();

const obj1 = {};
const obj2 = {};

ws.add(obj1);
ws.add(obj2);

console.log(ws.has(obj1)); // true
console.log(ws.has(obj2)); // true

ws.delete(obj1);
console.log(ws.has(obj1)); // false

三:总结

1:键或值是弱引用的

2:目的是为了解决对象引用导致的内存泄漏问题