HLJ 发布于
2025-06-11 09:49:01
0阅读

JavaScript WeakMap 和 WeakSet(弱映射和弱集合)

JavaScript WeakMap 和 WeakSet(弱映射和弱集合)

WeakMap(弱映射)

WeakMap 是一种特殊的 Map,具有以下特性:

  1. 键必须是对象(不能是原始值)
  2. 键是弱引用的(不会阻止垃圾回收)
  3. 不可迭代(没有 keys()、values()、entries() 方法)
  4. 没有 size 属性

基本用法

let weakMap = new WeakMap();

let obj1 = {};
let obj2 = {};

// 设置键值对
weakMap.set(obj1, "私有数据1");
weakMap.set(obj2, "私有数据2");

// 获取值
console.log(weakMap.get(obj1)); // "私有数据1"

// 检查键是否存在
console.log(weakMap.has(obj1)); // true

// 删除键值对
weakMap.delete(obj1);

应用场景

  1. 存储私有数据(与对象关联但不暴露)
  2. 缓存系统(对象被回收时自动清除相关缓存)
  3. DOM 元素元数据存储
// 私有数据示例
let privateData = new WeakMap();

class Person {
  constructor(name, age) {
    privateData.set(this, { name, age });
  }
  
  getName() {
    return privateData.get(this).name;
  }
  
  getAge() {
    return privateData.get(this).age;
  }
}

WeakSet(弱集合)

WeakSet 是一种特殊的 Set,具有以下特性:

  1. 值必须是对象(不能是原始值)
  2. 值是弱引用的(不会阻止垃圾回收)
  3. 不可迭代
  4. 没有 size 属性

基本用法

let weakSet = new WeakSet();

let obj1 = {};
let obj2 = {};

// 添加值
weakSet.add(obj1);
weakSet.add(obj2);

// 检查值是否存在
console.log(weakSet.has(obj1)); // true

// 删除值
weakSet.delete(obj1);

应用场景

  1. 标记对象(跟踪对象是否已被处理)
  2. 避免内存泄漏(临时集合不需要手动清理)
// 标记已处理的对象
let processedObjects = new WeakSet();

function processObject(obj) {
  if (!processedObjects.has(obj)) {
    // 处理对象...
    processedObjects.add(obj);
  }
}

与 Map/Set 的主要区别

特性 Map/Set WeakMap/WeakSet
键/值类型 任意 仅对象
可迭代
size 属性
垃圾回收影响 阻止键/值被回收 不阻止键/值被回收
性能 稍低 更高(因弱引用特性)

WeakMap 和 WeakSet 的主要优势在于它们不会阻止其键/值被垃圾回收,从而有助于避免内存泄漏。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/797.html
最后生成于 2025-06-13 20:52:50
此内容有帮助 ?
0