在 javascript 中,weakmap 和 weakset 是用于存储弱引用的集合对象。weakmap 的键必须是对象,且这些键是弱引用的,当键对象不再被其他引用持有时,它会被垃圾回收;weakset 的值也是对象,同样具有弱引用特性。使用它们可以避免内存泄漏,特别适合处理 dom 元素或临时数据关联。

WeakMap 如何存储与 DOM 相关的私有数据
WeakMap 允许你将数据与特定的 DOM 元素关联,而不会阻止该元素被垃圾回收。例如,你可以为每个按钮存储一个点击计数器,当按钮从页面移除时,对应的计数数据也会自动清理。

const button = document.getElementById('myButton');
const privateData = new WeakMap();
privateData.set(button, { clicks: 0 });
button.addEventListener('click', () => {
const data = privateData.get(button);
if (data) {
data.clicks++;
console.log(`Clicked ${data.clicks} times`);
}
});
// 假设按钮被移除
// button.parentNode.removeChild(button);
// 此时,button 对象如果没有其他引用,将被垃圾回收
// privateData 中的对应条目也会自动消失WeakSet 如何管理一组可销毁的对象
WeakSet 用于存储一组对象,这些对象可以被随时移除且不会造成内存泄漏。例如,你可以用 WeakSet 来跟踪哪些对象已经被处理过,或者哪些对象需要被特殊对待,当这些对象不再被使用时,它们会自动从 WeakSet 中移除。
立即学习“Java免费学习笔记(深入)”;

const activeObjects = new WeakSet();
function processObject(obj) {
if (!activeObjects.has(obj)) {
activeObjects.add(obj);
console.log('Processing object:', obj);
// 执行一些操作...
} else {
console.log('Object already processed.');
}
}
const obj1 = { id: 1 };
const obj2 = { id: 2 };
processObject(obj1); // Processing object: { id: 1 }
processObject(obj2); // Processing object: { id: 2 }
processObject(obj1); // Object already processed.
// 如果 obj1 不再被其他变量引用,它将从 activeObjects 中自动移除WeakMap 在键冲突时的行为表现
当 WeakMap 的键发生冲突时,即两个不同的对象具有相同的引用时,WeakMap 会视为同一个键。这意味着如果你尝试设置两个相同对象的值,后设置的值会覆盖先设置的值。这种行为确保了数据的唯一性和一致性。


















