set通过add()、delete()、has()实现唯一值管理:add()自动去重并返回set本身;has()以o(1)判断存在性,支持任意类型但按引用比较对象;delete()安全移除并返回布尔结果。

用 Set 管理唯一值列表,核心就是靠 add()、delete() 和 has() 三个方法——它们天然去重、操作直观、时间复杂度接近 O(1)。
添加唯一值:用 add() 自动去重
add() 不会重复插入已存在的值,也不报错,适合在循环或事件中安全追加:
- 调用
set.add(value),无论value是否已存在,Set 都保持唯一 - 返回值是 Set 本身(可链式调用),不是布尔值
- 注意:NaN 和
NaN被认为相等(ES6 行为),0和-0也被视为相同
检查是否存在:用 has() 快速判断
has() 是唯一可靠的“是否包含”检测方式,比 indexOf 或 includes 在数组中查更快更准:
- 返回
true或false,不抛异常 - 支持任意类型(对象、函数、Symbol),但注意引用相等性:两个不同对象即使内容一样,
has()也返回false - 适合做条件分支,比如“如果没加过才添加”:
if (!set.has(item)) set.add(item)
删除指定值:用 delete() 安全移除
delete() 移除成功返回 true,未找到返回 false,不会影响其他元素:
- 只删一个匹配值(按 SameValueZero 比较),不能删多个或用条件删
- 删除后 Set 大小实时更新,
size属性立刻反映变化 - 对不存在的值调用不会出错,适合在不确定是否存在的场景下直接删
配合使用的小技巧
实际开发中常组合使用,比如维护用户选中的标签、防重复提交的 ID 缓存:
- 初始化:
const selected = new Set(['a', 'b']); - 点击添加:
selected.add(newTag); - 点击取消:
selected.delete(tagToUnselect); - 渲染前转数组:
Array.from(selected)或[...selected] - 清空全部:
selected.clear()(虽然不是 add/delete/has,但很常用)
不复杂但容易忽略:Set 的值是按引用比较对象,如需按内容去重,得自己封装逻辑或改用 Map + 序列化键。










