weakset 适合标记已访问 dom 元素,因其弱引用不阻止垃圾回收,避免内存泄漏;仅支持 add()、has()、delete(),不可遍历、无 size、不支持 clear(),且只接受对象。

WeakSet 是 JavaScript 中一种特殊的集合类型,适合用来标记已访问过的 DOM 元素,因为它不阻止元素被垃圾回收,也不会造成内存泄漏。
为什么用 WeakSet 而不是 Set?
DOM 元素是对象,如果用普通 Set 存储,即使元素从 DOM 中移除、不再被其他代码引用,只要 Set 还持有它,它就无法被 GC 回收。而 WeakSet 的键必须是对象,且是“弱引用”——不阻止垃圾回收,更安全。
注意:WeakSet 不能遍历、没有 size 属性、不支持 clear(),只提供 add()、has()、delete() 方法。
基本用法:标记和检测访问状态
创建一个 WeakSet 实例,每次处理元素前先检查是否已存在,处理完再加入:
const visited = new WeakSet();
function processElement(el) {
if (visited.has(el)) return;
// 执行你的逻辑,比如添加 class、记录数据等
el.classList.add('processed');
visited.add(el);
}
// 示例:遍历一组按钮
document.querySelectorAll('button').forEach(processElement);
配合事件委托或递归遍历时避免重复
在树形结构(如 DOM 树)遍历中,容易遇到同一元素被多次传入的情况。WeakSet 可天然去重:
const seen = new WeakSet();
function traverse(node) {
if (!node || seen.has(node)) return;
seen.add(node);
// 处理当前节点
if (node.nodeType === Node.ELEMENT_NODE) {
console.log('Visited:', node.tagName);
}
// 递归子节点
node.childNodes.forEach(traverse);
}
traverse(document.body);
注意事项和常见误区
- WeakSet 只接受对象(包括 DOM 元素),不能存字符串、数字、
null或undefined - 无法枚举内容,所以不能用于“找出所有已访问元素”,仅适合“查是否存在”场景
- 不要试图用 WeakSet 替代状态管理(比如保存处理结果),它只适合轻量标记
- 如果需要跨函数共享状态,确保 WeakSet 实例是闭包内持久存在的(如模块顶层或类字段)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











