当前位置: 首页 > news >正文

JS中的Set和WeakSet联系与区别

JavaScript 中 SetWeakSet 的区别、联系及示例


核心区别
特性SetWeakSet
值的类型允许任意类型的值(对象、原始值)值必须是对象(非原始值)
垃圾回收强引用值 → 阻止垃圾回收弱引用值 → 不影响垃圾回收
可遍历性支持遍历(keys(), values(), for...of不可遍历(无遍历方法)
Size 属性size 属性获取元素数量size 属性
清除方法clear() 方法clear() 方法
初始化可初始化值(new Set([1, 2])必须逐项添加(不能初始化)
性能适合存储长期存在的数据内存优化(自动清理无引用值)

核心联系
  1. 集合特性
    二者均为值唯一的集合:add(value) / has(value) / delete(value)
  2. 值唯一性
    集合中每个值都是唯一的(基于严格相等 ===
  3. 相同方法
    都支持 add(), has(), delete() 方法

代码示例

1. Set 基本用法
const users = new Set();// 添加任意类型值
users.add("Alice");          // ✅ 字符串
users.add(42);               // ✅ 数字
users.add({ id: 1 });        // ✅ 对象console.log(users.size);      // 3
console.log(users.has(42));   // true// 遍历Set
for (const user of users) {console.log(user); // "Alice", 42, {id:1}
}
2. WeakSet 基本用法
const userObjects = new WeakSet();
const alice = { name: "Alice" };
const bob = { name: "Bob" };// 只能添加对象引用
userObjects.add(alice);         // ✅
userObjects.add(bob);           // ✅
// userObjects.add("Charlie");  // ❌ TypeErrorconsole.log(userObjects.has(alice));  // true// 对象销毁后自动清理
alice = null;  // 移除引用// 垃圾回收后,WeakSet自动移除alice
// userObjects.has(alice) → false (无法直接验证)

高级场景示例

场景 1:Set 实现数组去重
const duplicates = [1, 2, 2, 3, 4, 4];
const unique = [...new Set(duplicates)]; // [1, 2, 3, 4]// 对象去重(需注意引用不同)
const objSet = new Set([{id:1}, {id:1}]);
console.log(objSet.size); // 2 (不同对象引用)
场景 2:WeakSet 检测对象存在性
const activeSessions = new WeakSet();function startSession(user) {if (activeSessions.has(user)) {console.log("Session already exists!");return;}activeSessions.add(user);console.log("New session started");
}const user = { id: 1001 };
startSession(user);  // New session started
startSession(user);  // Session already exists!// 当用户退出时自动清理
user = null; 
场景 3:WeakSet 实现私有属性标记
const protectedFiles = new WeakSet();class FileSystem {constructor(file) {protectedFiles.add(file);this.file = file;}delete() {if (protectedFiles.has(this.file)) {throw Error("Protected file cannot be deleted");}// 删除逻辑...}
}const secretFile = { name: "config.yml" };
const fs = new FileSystem(secretFile);fs.delete(); // ❌ Error: Protected file cannot be deleted

使用建议

场景推荐原因
数组去重Set高效值唯一性检查
需要遍历集合元素Set支持迭代器接口
存储原始值SetWeakSet 不支持原始值
关联对象的临时状态WeakSet自动内存管理,避免泄漏
标记/验证对象存在性WeakSet轻量级且自动清理
长期存储数据集合SetWeakSet 无法长期保留值

核心总结

  • 使用 Set 处理通用集合操作(遍历、去重、包含原始值)
  • 使用 WeakSet 处理对象关联的临时状态(自动垃圾回收是核心优势)
http://www.dtcms.com/a/315032.html

相关文章:

  • 数据结构---配置网络步骤、单向链表额外应用
  • 【Linux】Linux 操作系统 - 33 , 线程(二) 线程互斥和同步 , 带你对线程使用深刻理解 !
  • 《Python 实用项目与工具制作指南》· 2.2 变量
  • JVM调优工具详解
  • 把“距离过近”的节点(或端点)合并成一个,避免重复。机器学习 python
  • web:ts元组
  • 【RH124知识点问答题】第8章 监控和管理 Linux 进程
  • Bean的生命周期和循环依赖问题的解决
  • 防火墙认证用户部署
  • 开发规范(一)移动端
  • 多线程(一)
  • 【C#】操作Execl和Word文件-1
  • 子词分词器(Byte Pair Encoding + WordPiece)
  • 如何给Word和WPS文档添加密码或取消密码
  • 【Java】使用FreeMarker来实现Word自定义导出
  • 反转字符串中的元音字母:Swift 双指针一步到位
  • EXPLAIN工具:查询执行计划分析与索引诊断
  • 【数据结构】排序(sort) -- 插入排序
  • 如何设置端口映射?防火墙/路由器/纯软件工具多种常用方案步骤,确保任意内网ip端口映射公网访问到
  • 《汇编语言:基于X86处理器》第11章 复习题和练习
  • RocketMQ与Kafka 消费者组的‌重平衡操作消息顺序性对比
  • Hadoop MapReduce 3.3.4 讲解~
  • Linux系统编程-文件操作(黑马笔记)
  • 基于Springboot+Mybatis+thymeleaf的个人博客系统的设计与实现
  • EXCEL删除数据透视表
  • 洛谷 P3373 【模板】线段树 2- 普及+/提高
  • C# 类型
  • 基于PSO-NSGAIII混合优化的生产调度算法matlab仿真,输出甘特图,对比PSO和NSGAIII
  • traefik网关鉴权中间件转发multipart/form-data请求的multipart: NextPart: EOF问题
  • 09 Linux基础(8.4)