用 set.prototype.has() 替代 array.includes() 可提升查找效率,因前者平均时间复杂度为 o(1),后者为 o(n);适用于高频“是否存在”判断场景,如权限校验、白名单过滤等。

用 Set.prototype.has() 替代 Array.includes() 主要是为了提升查找效率,尤其在数据量较大或高频查找场景下效果明显。核心优势在于时间复杂度:前者是 O(1)(平均),后者是 O(n)。
适用场景:需要频繁判断“是否存在”
当你反复检查某个值是否在集合中(比如去重校验、权限判断、白名单过滤),而不是按顺序遍历或依赖索引时,Set 更合适。
- 例如:用户点击按钮前校验其角色是否在
['admin', 'editor']中 → 改用new Set(['admin', 'editor'])+.has(role) - 避免把静态白名单数组每次调用都走一遍
includes
构建 Set 的开销是一次性的,值得投入
Set 的初始化是 O(n),但只需做一次;后续每次 has() 都接近常数时间。只要查找次数 ≥ 2–3 次,通常就能回本。
- 错误写法:
['a','b','c'].includes(x)在循环里反复调用 - 正确做法:
const validKeys = new Set(['a','b','c']); /* 之后用 validKeys.has(x) */
注意类型和引用的严格匹配
Set.prototype.has() 使用 SameValueZero 比较(类似 ===),对对象引用敏感,这点和 Array.includes() 一致,但容易被忽略:
-
new Set([{id:1}]).has({id:1})→false(两个不同对象) - 若需基于属性查对象,仍需额外映射(如用
Map或预处理为 ID Set) - 字符串、数字、布尔值等原始类型完全兼容,无需改动逻辑
小技巧:快速从数组转 Set 并复用
已有数组时,一行即可升级:
const arr = [1, 2, 3]; const set = new Set(arr);- 支持解构和扩展:
const set = new Set([...arr, 4, 5]); - 配合
filter去重:const uniqueSet = new Set(arr); const filtered = arr.filter(x => uniqueSet.has(x));(虽然一般直接用 Set 构造去重更简单)










