WeakMap 是一种特殊的 Map,具有以下特性:
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);
// 私有数据示例
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 是一种特殊的 Set,具有以下特性:
let weakSet = new WeakSet();
let obj1 = {};
let obj2 = {};
// 添加值
weakSet.add(obj1);
weakSet.add(obj2);
// 检查值是否存在
console.log(weakSet.has(obj1)); // true
// 删除值
weakSet.delete(obj1);
// 标记已处理的对象
let processedObjects = new WeakSet();
function processObject(obj) {
if (!processedObjects.has(obj)) {
// 处理对象...
processedObjects.add(obj);
}
}
特性 | Map/Set | WeakMap/WeakSet |
---|---|---|
键/值类型 | 任意 | 仅对象 |
可迭代 | 是 | 否 |
size 属性 | 有 | 无 |
垃圾回收影响 | 阻止键/值被回收 | 不阻止键/值被回收 |
性能 | 稍低 | 更高(因弱引用特性) |
WeakMap 和 WeakSet 的主要优势在于它们不会阻止其键/值被垃圾回收,从而有助于避免内存泄漏。