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

5次阅读

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

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

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() 多套一层。

立即学习Java 免费学习笔记(深入)”;

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。这些不是语法错误,但会影响逻辑正确性。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-08发表,共计1406字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。