javascript Set是什么_如何用它来存储唯一值?

发布时间 - 2026-01-09 00:00:00    点击率:
Set是JavaScript中用于存储唯一值的原生集合容器,基于SameValueZero算法去重,支持快速查存;可用new Set()初始化、add()添加、has()检测、扩展运算符转数组。

Set 是什么:一个原生的唯一值集合容器

JavaScript 的 Set 是一个内置构造函数,用来创建元素值唯一的集合。它不基于键名索引,也不要求元素可序列化——只要值在抽象相等(SameValueZero)意义上不重复,就只存一份。Set 不是数组的替代品,而是解决「去重 + 快速查存」这类需求的更语义化工具。

如何初始化和添加唯一值:new Set() + add()

最常用的方式是传入可迭代对象(如数组)初始化,或用 add() 逐个插入。注意:原始值(stringnumberbooleannullundefinedSymbol)按值比较;对象按引用比较。

const s1 = new Set([1, 2, 2, 3]); // {1, 2, 3}
const s2 = new Set();
s2.add('a').add('b').add('a'); // {'a', 'b'} —— 链式调用返回自身
s2.add({}).add({}); // 两个不同对象,都会被存入
  • add() 总是返回 Set 实例本身,支持链式调用
  • 不能用 s[0]s.length 访问元素或长度——要用 s.size
  • 初始化时传入 nullundefined 会报错;空数组则得到空 Set

怎么判断值是否存在:has() 比 includes() 更可靠

数组的 includes()NaN 有效,但 Set.prototype.has() 同样支持,并且性能更好(平均 O(1) 查找)。更重要的是:has() 是唯一推荐的成员检测方式,不要试图用 Array.from(s).includes(x) 绕路。

const s = new Set([1, NaN, 'hello']);
s.has(1);      // true
s.has(NaN);    // true —— 这是 Set 的优势之一
s.has(2);      // false
  • has() 使用 SameValueZero 算法,能正确识别 NaN0 === -0
  • 没有 contains() 方法,别和 Java 或 Python 混淆
  • 对大型集合做存在性检查时,has() 比遍历数组快得多

从 Set 转回数组或遍历:用扩展运算符或 for...of

要转成数组,优先用 [...set];需要处理每个值,用 for...of 最直接。避免用 Array.from(set).forEach() 多套一层。

const s = new Set(['a', 'b', 'c']);
const arr = [...s]; // ['a', 'b', 'c']
for (const item of s) {
  console.log(item); // 依次输出 'a', 'b', 'c'
}
  • Set 本身不可索引,也没有 map()filter() 等方法——必须先转数组再操作
  • forEach() 也支持,但参数顺序是 (value, value, set),第二个参数是冗余的,容易写错
  • 如果只是去重后转数组,[...new Set(arr)] 是最简写法,但要注意对象去重无效
Set 的边界行为容易被忽略:比如 new Set([0, -0]) 只存一个元素,new Set([undefined, null]) 存两个;还有弱引用场景该用 WeakSet 而不是 Set。这些不是语法错误,但会影响逻辑正确性。


# javascript  # python  # java  # 工具  # ai  # 可迭代对象 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: zabbix利用python脚本发送报警邮件的方法  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel如何配置任务调度?(Cron Job示例)  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  详解vue.js组件化开发实践  Laravel中的Facade(门面)到底是什么原理  在centOS 7安装mysql 5.7的详细教程  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  微信小程序 wx.uploadFile无法上传解决办法  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  如何将凡科建站内容保存为本地文件?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Linux网络带宽限制_tc配置实践解析【教程】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Python文件异常处理策略_健壮性说明【指导】  Thinkphp 中 distinct 的用法解析  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  微信推文制作网站有哪些,怎么做微信推文,急?  Python文本处理实践_日志清洗解析【指导】  Linux系统命令中screen命令详解  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel如何与Pusher实现实时通信?(WebSocket示例)  javascript中闭包概念与用法深入理解  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel如何处理表单验证?(Requests代码示例)  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  如何快速重置建站主机并恢复默认配置?  昵图网官网入口 昵图网素材平台官方入口  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  javascript中对象的定义、使用以及对象和原型链操作小结  MySQL查询结果复制到新表的方法(更新、插入)  iOS UIView常见属性方法小结  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何在Tomcat中配置并部署网站项目?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  phpredis提高消息队列的实时性方法(推荐)  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解