推荐答案
// www.javascriptcn.com code example
// WeakSet 示例
const weakSet = new WeakSet();
let obj1 = { name: 'Alice' };
let obj2 = { name: 'Bob' };
weakSet.add(obj1);
weakSet.add(obj2);
console.log(weakSet.has(obj1)); // true
obj1 = null; // 当 obj1 被垃圾回收时,WeakSet 中的引用也会自动移除
// WeakMap 示例
const weakMap = new WeakMap();
let key1 = { id: 1 };
let key2 = { id: 2 };
weakMap.set(key1, 'Value1');
weakMap.set(key2, 'Value2');
console.log(weakMap.get(key1)); // 'Value1'
key1 = null; // 当 key1 被垃圾回收时,WeakMap 中的键值对也会自动移除本题详细解读
WeakSet 的用法
WeakSet 的特点:
- WeakSet 是一种集合数据结构,类似于 Set,但它只能存储对象引用。
- WeakSet 中的对象是弱引用,即如果对象没有被其他强引用指向,它会被垃圾回收机制自动回收。
- WeakSet 没有
size属性,也不能遍历其中的元素。
WeakSet 的常用方法:
add(value):向 WeakSet 中添加一个对象。delete(value):从 WeakSet 中删除一个对象。has(value):检查 WeakSet 中是否包含某个对象。
WeakSet 的使用场景:
- 适用于存储临时对象,且不希望这些对象影响垃圾回收机制。
- 例如,可以用来存储 DOM 元素的引用,当 DOM 元素被移除时,WeakSet 中的引用也会自动移除。
WeakMap 的用法
WeakMap 的特点:
- WeakMap 是一种键值对集合,类似于 Map,但它的键必须是对象。
- WeakMap 中的键是弱引用,即如果键对象没有被其他强引用指向,它会被垃圾回收机制自动回收。
- WeakMap 没有
size属性,也不能遍历其中的键值对。
WeakMap 的常用方法:
set(key, value):向 WeakMap 中添加一个键值对。get(key):获取指定键对应的值。delete(key):删除指定键的键值对。has(key):检查 WeakMap 中是否包含某个键。
WeakMap 的使用场景:
- 适用于存储与对象相关的元数据,且不希望这些元数据影响垃圾回收机制。
- 例如,可以用来存储 DOM 元素的附加信息,当 DOM 元素被移除时,WeakMap 中的键值对也会自动移除。
总结
- WeakSet 和 WeakMap 都是弱引用的数据结构,适用于存储临时对象或与对象相关的元数据。
- 它们的主要优势在于不会阻止垃圾回收机制回收对象,从而避免内存泄漏。
- 由于它们不支持遍历和获取大小,因此适用于特定的场景,如存储临时数据或附加信息。