Set 的 add、delete、has 方法分别实现唯一添加、安全删除和 O(1) 存在性判断:add 自动去重并支持链式调用;delete 用 SameValueZero 比较,失败不报错;has 高效支持 NaN 等特殊值判别。

Set 是 JavaScript 中用于存储唯一值的集合对象,用 add、delete 和 has 三个核心方法就能高效管理数据——添加不重复项、删除指定项、快速判断是否存在。
add:添加元素(自动去重)
add() 方法向 Set 添加一个值,如果该值已存在,不会重复添加,也不报错,返回当前 Set 对象(支持链式调用)。
示例:
const tags = new Set();
tags.add('js').add('css').add('js'); // 第二个 'js' 被忽略
console.log(tags.size); // 2
console.log([...tags]); // ['js', 'css']
- 支持任意类型:字符串、数字、布尔值、对象(注意:对象按引用判断是否重复)
- NaN 和
0各自视为唯一值(但NaN === NaN为 false,Set 内部特殊处理使其能正确去重)
delete:删除指定元素
delete() 接收一个参数,尝试移除 Set 中与之严格相等(SameValueZero 比较)的值,删除成功返回 true,否则返回 false。
示例:
const cart = new Set(['apple', 'banana', 'orange']);
console.log(cart.delete('banana')); // true
console.log(cart.delete('grape')); // false(不存在)
console.log([...cart]); // ['apple', 'orange']
- 删除对象时需传入原引用,用新对象字面量无法删掉(因为引用不同)
- 对不存在的值调用 delete 不会报错,只返回 false,适合安全删除场景
has:快速判断是否存在
has() 是 Set 最常用的查询方法,时间复杂度为 O(1),比数组 includes() 或 indexOf() 高效得多,尤其适合大数据量判重。
示例:
const visited = new Set([1, 2, 3, 5]); console.log(visited.has(3)); // true console.log(visited.has(4)); // false console.log(visited.has(NaN)); // true(即使 NaN !== NaN,Set 内部支持)
- 适用于权限校验、防重复提交、缓存命中判断等高频检查场景
- 和 Map 的
has()行为一致,但 Set 只检查键(值即键)
这三个方法配合使用,让 Set 成为轻量级、高性能的数据去重与状态管理工具,不依赖外部库也能写出清晰健壮的逻辑。


















