javascript 中的 set 对象天然支持 for...of 循环,因其实现了可迭代协议,遍历返回插入顺序的唯一元素,无需转换;可解构复合结构,但遍历时修改对象属性会影响原引用,不可安全删除当前项。

JavaScript 中的 Set 对象天然支持 for...of 循环,因为它实现了可迭代协议([Symbol.iterator]),所以可以直接用 for...of 遍历其元素,无需转换为数组或其他结构。
直接用 for...of 遍历 Set 元素
Set 的每次迭代返回的是当前元素本身(不是键值对),顺序是插入顺序。这是最简洁、最推荐的方式:
const mySet = new Set(['a', 'b', 'c']);
for (const item of mySet) {
console.log(item); // 输出: 'a', 'b', 'c'
}
- 不需要调用
mySet.values()或[...mySet],for...of会自动使用默认迭代器 - 遍历结果不包含重复项,符合
Set去重特性 - 如果 Set 为空,循环体不会执行,不会报错
遍历时注意元素类型和引用行为
Set 存储的是值的引用(对对象)或值本身(对原始类型)。遍历时拿到的是原值或原引用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = { id: 1 };
const set = new Set([obj, 'hello']);
for (const item of set) {
if (typeof item === 'object') {
item.name = 'updated'; // 修改原对象
}
}
console.log(obj.name); // 'updated'
- 遍历中修改对象属性会影响原始对象,因为引用相同
- 对原始类型(如字符串、数字)赋值操作不影响 Set 内部存储(不可变)
- 不能在遍历中直接用
set.delete()安全删除当前项(虽不报错,但可能跳过后续项);如需过滤,建议先转成数组再操作
配合解构或嵌套结构一起使用
如果 Set 存储的是数组、对象等复合结构,可在 for...of 中直接解构:
const pairSet = new Set([[1, 'a'], [2, 'b']]);
for (const [num, letter] of pairSet) {
console.log(num, letter); // 1 'a',然后 2 'b'
}
const userSet = new Set([
{ name: 'Alice', age: 30 },
{ name: 'Bob', age: 25 }
]);
for (const { name, age } of userSet) {
console.log(`${name} is ${age}`); // Alice is 30,Bob is 25
}
- 解构语法让代码更清晰,尤其适合处理元组或固定结构的对象
- 注意:解构失败时(如属性不存在)会得到
undefined,可加默认值避免报错
与 for...of 搭配的常见实用技巧
实际开发中常结合其他语言特性提升效率:
- 用
break或continue控制流程,比如找到首个匹配项就退出:if (item === target) break; - 配合
Array.from(set)或扩展运算符只在需要索引或多次遍历时才转换,避免不必要的开销 - 想同时获取索引?可以手动计数:
let i = 0; for (const item of set) { console.log(i++, item); }
不复杂但容易忽略:Set 的遍历顺序就是插入顺序,且每次迭代返回唯一值,for...of 是它最自然的搭档。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










