set本身自动去重,无需迭代器参与;其构造时即通过samevaluezero算法过滤重复值,扩展运算符、array.from等只是将已去重的set转为数组。

Set 本身就是一个去重的数据结构,**不需要通过迭代器来去重**。你可能是想问:“如何用 Set 配合迭代器(如 for...of、扩展运算符、Array.from 等)实现数组或类数组数据的去重?”——这是常见误解,下面直接讲清楚逻辑和用法。
Set 本身自动去重,创建时就完成“过滤”
Set 构造函数接收一个可迭代对象(如数组),会自动忽略重复值:
const arr = [1, 2, 2, 3, 3, 4];
const uniqueSet = new Set(arr); // {1, 2, 3, 4}
console.log([...uniqueSet]); // [1, 2, 3, 4]
这里没有手动调用迭代器去“执行去重”,而是 Set 内部在构造时遍历输入,并用内部算法保证每个值唯一。
常用配合迭代器的去重写法(本质是“转成 Set 再转回数组”)
所谓“通过迭代器去重”,实际是指利用 Set 的可迭代特性,结合解构、循环等语法把去重结果取出来:
-
扩展运算符(最常用):
[...new Set(arr)] -
Array.from():
Array.from(new Set(arr)) - for...of 循环手动收集:
const arr = ['a', 'b', 'a', 'c'];
const seen = new Set();
const unique = [];
for (const item of arr) {
if (!seen.has(item)) {
seen.add(item);
unique.push(item);
}
}
// unique === ['a', 'b', 'c']
注意:这个 for...of 示例是“模拟 Set 去重逻辑”,不是用 Set 的迭代器去重,而是用它辅助判断是否已存在。
Set 迭代器本身不修改原数据,只读访问
Set.prototype.values()、keys()、[Symbol.iterator] 返回的是同一个迭代器对象,用于遍历已有元素:
const s = new Set([1, 2, 2, 3]); const it = s.values(); console.log(it.next().value); // 1 console.log(it.next().value); // 2 console.log(it.next().value); // 3
这个迭代器只是按插入顺序输出当前已去重的值,**不会触发或参与去重过程**。
对象/函数等引用类型去重需注意“相等判定”
Set 使用 SameValueZero 比较(类似 ===,但 NaN === NaN 为 true),所以:
- 基本类型(数字、字符串)去重可靠
- 对象、函数即使内容相同,也视为不同引用:
new Set([{a:1}, {a:1}])长度为 2 - 如需按内容去重,得先序列化或自定义逻辑(Set 本身不支持)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











