Set.prototype.has 用于快速判断 Set 是否包含指定值并返回布尔值,内部用严格相等比较但 NaN 视为相等,基本类型按值匹配、对象按引用匹配,时间复杂度 O(1),性能优于数组查找。

Set.prototype.has 用于快速判断一个 Set 实例中是否包含指定的值,返回布尔值 true 或 false。
基本用法很简单
调用方式是 set.has(value),其中 value 是你要查找的元素。它内部使用严格相等(===)比较,但对 NaN 的处理是个例外——Set 认为 NaN 等于自身(而 NaN === NaN 是 false),所以 new Set([NaN]).has(NaN) 返回 true。
- 字符串、数字、布尔值等基本类型直接按值匹配
- 对象和函数按引用匹配(同一个对象实例才返回
true) - 对
undefined和null没有特殊处理,照常比较
常见使用场景
检查用户权限、过滤重复项、判断缓存是否存在时很实用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如权限校验:
const permissions = new Set(['read', 'write']); permissions.has('delete') // false - 避免重复添加:
if (!mySet.has(item)) mySet.add(item) - 配合数组去重后快速查询:
const uniqueIds = new Set([101, 102, 103]); uniqueIds.has(102) // true
注意值类型和引用一致性
对象或数组作为元素时,has 不会深比较内容,只认内存地址。
立即学习“Java免费学习笔记(深入)”;
const s = new Set([{id: 1}]); s.has({id: 1}) // false(新对象,不同引用)const obj = {id: 1}; const s = new Set([obj]); s.has(obj) // true(同一引用)- 如需按内容查找,得自己遍历或改用 Map + JSON 序列化(仅限简单结构)
性能优势明显
相比数组的 includes() 或 indexOf(),has() 平均时间复杂度是 O(1),特别适合频繁查询的大型集合。
- 数组查找最坏是
O(n),而Set底层基于哈希表实现 - 尤其在数据量大、查询频繁时,性能差距更显著
- 不过小数据量下差异几乎不可测,不必过度优化

















