for...of 循环可直接遍历 Set,按插入顺序返回每个唯一元素,支持所有类型值(含对象、Symbol 等),无需转换且性能最优。

JavaScript 中 for...of 循环可以直接遍历 Set,每次迭代返回一个独立元素(即 Set 中去重后的值),无需额外解构或转换。
直接遍历 Set 获取每个唯一值
Set 是可迭代对象,for...of 会按插入顺序依次访问每个元素,且自动跳过重复项(因为 Set 本身不存重复):
- 语法简洁:不需要
keys()、values()或展开运算符 - 每次循环变量就是该轮的独立元素,类型与插入时一致(数字、字符串、对象引用等)
- 适用于所有合法 Set 元素,包括
null、undefined、对象、Symbol 等
示例:
const mySet = new Set([1, 2, 2, 'a', 'a', {}, {}]);
for (const item of mySet) {
console.log(item); // 输出:1 → 2 → 'a' → {} → {}(两个空对象视为不同引用)
}
配合解构或条件处理提取特定元素
若需筛选、转换或只取前 N 个,可在循环体内加逻辑:
立即学习“Java免费学习笔记(深入)”;
- 用
if过滤符合条件的独立元素(如只取字符串) - 用
break或计数器提前退出(如只处理前 3 个) - 用数组
push()或其他方式收集结果,避免副作用
示例(提取所有字符串):
const mixedSet = new Set([1, 'hello', true, 'world', 42]);
const strings = [];
for (const item of mixedSet) {
if (typeof item === 'string') {
strings.push(item);
}
}
console.log(strings); // ['hello', 'world']
注意 Set 遍历顺序与引用相等性
Set 按插入顺序遍历,但“独立元素”取决于 SameValueZero 比较规则:
-
0和-0被视为相同,只保留第一个 -
NaN与自身相等(是 Set 中唯一的例外),不会重复添加 - 对象、函数、Symbol 总是独立,即使内容相同(因引用不同)
示例验证:
const s = new Set([0, -0, NaN, NaN, {a:1}, {a:1}]);
console.log([...s]); // [0, NaN, {a:1}, {a:1}](-0 被忽略,NaN 去重,两个对象都保留)
不推荐的替代写法(易出错)
避免绕路使用 Array.from(set) 或扩展运算符再遍历,除非真有数组专属操作需求:
- 多一次内存拷贝,降低性能(尤其大数据量 Set)
- 失去原生迭代的懒执行优势(如结合生成器)
- 无必要增加代码复杂度
正确做法始终优先用 for...of set —— 它最直接、高效、语义清晰。


















