set的has()平均时间复杂度为o(1),因其底层基于哈希表实现,通过哈希值直接定位元素;而数组includes()需遍历,时间复杂度为o(n)。

ES6 Set 在判断元素是否存在时,has() 方法的平均时间复杂度是 O(1)。
为什么能做到 O(1)?
Set 的底层实现基于哈希表(Hash Table),元素的存储和查找都依赖哈希值。只要哈希函数分布合理、冲突较少,查找操作就能在常数时间内完成。
- 对比数组的 includes() 或 indexOf():需要逐个遍历,时间复杂度为 O(n)
- 对比对象属性访问(如
obj[key] !== undefined):虽然也是 O(1),但语法不够直观,且键只能是字符串或 Symbol - Set 支持任意类型作为值(数字、字符串、NaN、对象引用等),且用 === 判断相等性(NaN 是唯一例外,被视为自身相等)
实际使用中的注意事项
尽管理论平均是 O(1),但极端情况下(如大量哈希冲突)可能退化为 O(n)。不过在日常前端开发中几乎不会遇到——浏览器引擎已对 Set 做了充分优化。
- 重复添加同一值不会报错,也不会改变 Set,has() 仍能稳定返回 true
- 对象作为元素时,判断依据是引用地址,不是内容深比较
- 对空 Set 调用 has(),结果恒为 false,开销依然接近常数
简单验证示例
const s = new Set([1, 2, 3, 4, 5]);
s.has(3); // true,执行极快,不随 Set 大小明显变慢
s.has(100); // false,同样快











