javascript 中 set 本身是可迭代对象,内置支持 iterator 协议,无需手动实现即可用 for...of、扩展运算符或 array.from() 进行唯一值迭代;其 symbol.iterator 默认返回遍历器,values()/keys()/entries() 行为一致,且比数组去重更高效。

JavaScript 中 Set 本身是可迭代对象,内置支持 Iterator 协议,无需手动实现 Iterator 就能直接用 for...of、扩展运算符或 Array.from() 进行唯一值迭代。
Set 天然符合 Iterator 接口
Set 实例的 @@iterator 方法(即 Symbol.iterator)默认返回一个遍历器对象,每次调用 next() 返回下一个唯一元素。这意味着 Set 不仅去重,还开箱即用支持标准迭代流程。
- Set 构造时自动过滤重复值,保证内部元素唯一
-
set[Symbol.iterator]()返回迭代器,可手动调用next() - 绝大多数迭代场景(如
for...of)会隐式调用该方法
常见唯一值迭代写法
利用 Set + Iterator 的组合,有多种简洁实用的方式遍历唯一值:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
for...of 循环:最直观,自动使用 Set 的迭代器
const set = new Set([1, 2, 2, 3, 1]);<br>for (const item of set) { console.log(item); } // 1, 2, 3 -
扩展运算符转数组:适合需要数组操作的场景
const uniqueArr = [...set]; // [1, 2, 3] -
Array.from() 转换:可传入映射函数,边迭代边处理
const doubled = Array.from(set, x => x * 2); // [2, 4, 6]
手动控制迭代过程(进阶用法)
若需精细控制(如中断、分步、条件跳过),可显式获取迭代器并调用 next():
- 调用
set.values()或set[Symbol.iterator]()获取迭代器 -
next()返回{ value, done }对象,done为true表示结束 - 注意:Set 的
values()、keys()、entries()都返回相同迭代器(因 Set 只存值,无键值对概念)
const iter = set.values();<br>console.log(iter.next()); // { value: 1, done: false }<br>console.log(iter.next()); // { value: 2, done: false }<br>console.log(iter.next()); // { value: 3, done: false }<br>console.log(iter.next()); // { value: undefined, done: true }与普通数组去重迭代对比
相比先用 [...new Set(arr)] 创建新 Set 再迭代,直接迭代 Set 更高效:
- 避免中间数组创建,节省内存(尤其大数据量)
- Set 插入和查重时间复杂度平均为 O(1),比
filter() + indexOf()的 O(n²) 更优 - 迭代顺序按插入顺序保留,符合直觉
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










