set是js中最简洁高效的去重与成员检查方式,因其天然唯一性及o(1)查找复杂度;支持一行去重[...new set(arr)],高效查重用set.has(x);对象需序列化或提取键处理;weakset不适用于此场景。

用 Set 去重和检查成员是 JS 里最简洁高效的方式,核心在于它天然保证值唯一、且查找时间复杂度为 O(1)。
快速去重:一行转回数组
Set 构造时自动过滤重复项,再用扩展运算符或 Array.from 转成数组即可:
-
推荐写法(简洁):
const unique = [...new Set(arr)] -
兼容旧环境(如需 IE):
const unique = Array.from(new Set(arr)) - 注意:
Set按插入顺序保存元素,去重后顺序不变
高效成员检查:比 includes 快得多
对大数组反复调用 arr.includes(x) 是 O(n) 操作;而 Set.has(x) 是 O(1),尤其适合高频查询:
- 先构建一次
const set = new Set(arr) - 后续检查统一用
set.has(item),无论数组多长都几乎等速 - 适用于白名单校验、防重复提交、缓存键存在判断等场景
处理对象或复杂值?得换思路
Set 对象去重基于引用相等(===),两个结构相同但内存地址不同的对象仍被视为不同成员:
- 直接用
new Set([{a:1}, {a:1}])长度仍是 2 - 若需按属性去重,得先序列化(如
JSON.stringify)或提取唯一标识(如id字段),再塞进Set - 例如:
const ids = new Set(arr.map(x => x.id)),再配合filter筛选
结合 WeakSet?不适用数组去重
WeakSet 只能存对象,且不支持遍历和 has 以外的方法,**不能用于数组去重或通用成员检查**:
- 它设计目标是弱引用缓存,避免内存泄漏
- 没有
size属性,也不能转成数组 - 日常去重和查重,请坚持用普通
Set











