Set是什么:前端人一看就懂
Set是什么?一句话:JavaScript 里的“唯一值集合”。它不像数组那样靠下标管理元素,而是专门处理去重、存在性判断、集合运算这类问题。理解它后,你会少写很多笨重循环。
Set是什么:先抓住一个核心
Set 是 ES6 引入的数据结构,用来存放不重复的值。你可以把它想成一个只收“唯一会员”的名单:同一个值加两次,名单里也只出现一次。
它的常用方法很少:add 添加,delete 删除,has 判断是否存在,clear 清空,size 看数量。语法不难,真正要理解的是它的使用边界:它解决的是“集合问题”,不是“列表问题”。
它和数组哪里不一样
数组关心位置:第 0 项、第 1 项、最后一项。Set 不关心下标,它关心某个值在不在集合里。数组可以有重复值,Set 天生去重。
比如用户选中的标签ID,用数组也能存,但你要自己防重复;用 Set,add 同一个ID多次也不会膨胀。相反,如果是评论列表,重复内容也可能是真实数据,就不该用 Set。
Set怎么判断“重复”
基本类型按值判断:数字、字符串、布尔值都很好理解。NaN 在 Set 里也会被当成同一个值,这比早期一些 NaN 比较逻辑省心。
对象比较要注意:Set 看的是引用。两个内容一样的对象,只要不是同一个引用,就会被认为不同。所以 [{id:1},{id:1}] 用 Set 不会自动按 id 去重。对象去重通常要配合 Map 或手写 key。
它最适合的三种场景
第一,数组去重:const unique = [...new Set(list)],适合基本类型数组。第二,高频查找:把白名单、黑名单、权限码转成 Set,用 has 判断。第三,临时状态集合:比如表格里选中的行ID。
还有集合运算,比如交集、并集、差集。前端做筛选器时很实用:A类标签命中的商品ID一个 Set,B类标签命中的商品ID一个 Set,取交集就能得到同时满足条件的商品。
回到问题:Set到底该怎么记
别把 Set 记成“数组增强版”,这会误导你。更准确的记法是:Set 是一张唯一值名单,擅长判断存在和消灭重复。
当你的需求里出现“不能重复”“有没有”“选中了哪些”“过滤掉哪些”这些词,脑子里可以亮一下 Set;如果需求强调顺序、下标、重复记录,那数组更合适。
常见问题
- Set是什么数据类型?
- Set 是 JavaScript 的内置集合类型,属于对象类型,用来存储唯一值。
- Set可以存对象吗?
- 可以存,但对象按引用去重,不按内容去重。两个内容一样的对象通常会被当成不同元素。
- Set有长度吗?
- Set 没有 length,用 size 获取元素数量,比如 mySet.size。