Set 的 forEach 方法遍历每个唯一值,参数为(value, key, set),其中 value 与 key 相同;支持遍历时删除元素但新增项仍会被遍历;不返回新数组,无法链式调用。

JavaScript 中 Set 的 forEach 方法用于遍历 Set 实例中的每个唯一值,语法简洁,行为与数组的 forEach 类似,但参数顺序和含义略有不同。
forEach 的基本用法和参数顺序
Set.prototype.forEach 接收一个回调函数,该函数会为 Set 中的每个值执行一次。它有三个参数:
- value:当前遍历的值(注意:Set 没有“键”,所以第一个和第二个参数都是 value)
- key:与 value 相同(这是为了与 Map 的 forEach 保持接口一致,实际使用中可忽略)
- set:当前正在遍历的 Set 实例(可用于内部操作,比如删除当前项)
示例:
const colors = new Set(['red', 'green', 'blue']);
colors.forEach((value, key, set) => {
console.log(`值: ${value}, 键: ${key}, 所属 Set:`, set);
});
// 输出三次,每次 value 和 key 都相同,set 是同一个 Set 实例
遍历时修改 Set 的注意事项
在 forEach 回调中可以安全读取 Set,但若尝试在遍历过程中 添加 新元素,新增项会被遍历到(因为 Set 是按插入顺序迭代);而 删除 当前正在处理的项不会报错,但也不会影响本次循环——它只是让后续遍历跳过该值(因为已被移除)。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
示例(安全删除):
const nums = new Set([1, 2, 3, 4]);
nums.forEach((val) => {
if (val % 2 === 0) nums.delete(val); // 删除偶数
});
console.log(nums); // Set {1, 3}
与 for...of 对比:何时选 forEach?
两者都能遍历 Set,但适用场景不同:
- 用 for...of 更直观、支持 break/continue、可解构、适合需要中途退出或复杂控制流的场景
- 用 forEach 更函数式,适合纯遍历+副作用(如打印、发送请求、更新外部状态),且天然绑定 this(如果传入第二个参数)
传入 this 的例子:
const logger = {
prefix: '[Set]',
log(value) {
console.log(this.prefix, value);
}
};
const fruits = new Set(['apple', 'banana']);
fruits.forEach(function (val) {
this.log(val);
}, logger); // 正确绑定 this
不支持返回值,无法链式调用
forEach 总是返回 undefined,不能像 map/filter 那样生成新结构。如果想转换数据,应配合 Array.from 或扩展运算符:
const set = new Set([1, 2, 3]); const doubled = Array.from(set, x => x * 2); // [2, 4, 6] // 或 const doubled2 = [...set].map(x => x * 2);

















