javascript 的 set 是存储唯一值的集合,add() 添加元素(支持链式调用且重复无效),has() 判断存在性(基于 ===,o(1) 查找),常用于去重与防重逻辑。

JavaScript 中的 Set 是一种集合数据结构,它只存储唯一值,不重复、无索引、不保证顺序(但实际插入顺序会被保留)。add() 和 has() 是最常用的方法:前者用于添加元素,后者用于判断某个值是否已存在。
add():向 Set 添加唯一值
add() 方法接收一个参数(任意类型),将它加入 Set。如果该值已存在,则不会重复添加,也不会报错,Set 保持不变。
- 支持任意类型:数字、字符串、布尔、对象、Symbol,甚至
undefined和null - 注意:对象和数组是按引用比较的,两个内容相同的对象仍被视为不同元素
- 方法返回 Set 本身,支持链式调用
示例:
const s = new Set();
s.add(1).add('a').add(true); // 链式添加
s.add(1); // 无效,1 已存在
console.log(s); // Set { 1, 'a', true }
has():快速判断值是否存在
has() 接收一个参数,返回布尔值:true 表示该值已在 Set 中,false 表示不存在。它的查找时间复杂度接近 O(1),比数组 includes() 或 indexOf() 更高效。
- 判断依据是严格相等(
===),所以has(0)和has(-0)都返回true(JS 中0 === -0) - 对
NaN的处理特殊:new Set([NaN]).has(NaN)返回true,而数组的includes()也支持,但传统indexOf()不行 - 对象需使用同一引用才能命中:
const obj = {}; s.add(obj); s.has(obj)→true;但s.has({})→false
结合 add 和 has 实现去重或条件添加
常见用途是避免重复插入,比如在事件处理、缓存管理或表单提交防重时。
- 先
has()判断,再add()—— 显式控制逻辑 - 直接
add()也安全,因为重复添加无副作用,适合简单场景
示例(仅当不存在时才添加并执行后续操作):
const visited = new Set();
function visitPage(url) {
if (!visited.has(url)) {
visited.add(url);
console.log('首次访问:', url);
// 这里可以发起请求、记录日志等
}
}
visitPage('/home'); // 首次访问:/home
visitPage('/home'); // 无输出
注意事项和小技巧
add() 和 has() 看似简单,但几个细节容易忽略:
-
Set对NaN的唯一性处理是可靠的,可放心用于含NaN的数据过滤 - 不能用点号访问属性(如
s.length),要用s.size获取元素个数 - 遍历推荐用
for...of或forEach(),不支持下标访问 - 想转成数组?用
Array.from(s)或[...s]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











