Map 默认返回键值对迭代器,Set 默认返回元素值迭代器;Map.prototype[Symbol.iterator]等价于entries(),Set.prototype[Symbol.iterator]等价于values()。

JavaScript 中的 Iterator 接口让 Map 和 Set 能用统一的遍历方式(如 for...of、扩展运算符、解构),关键在于它们都实现了 [Symbol.iterator] 方法,返回一个符合迭代器协议的对象。
Map 和 Set 默认返回什么迭代器?
Map.prototype[Symbol.iterator] 等价于 Map.prototype.entries(),返回键值对数组的迭代器;Set.prototype[Symbol.iterator] 等价于 Set.prototype.values(),返回元素值的迭代器。所以:
-
for (const item of map)→ 每次得到[key, value]数组 -
for (const item of set)→ 每次得到单个元素值
用 for...of 统一处理 Map 和 Set
虽然底层结构不同,但都能直接用 for...of 遍历,无需额外转换:
const map = new Map([['a', 1], ['b', 2]]);
const set = new Set([10, 20, 30]);
for (const [k, v] of map) {
console.log(`Map: ${k} → ${v}`);
}
// Map: a → 1
// Map: b → 2
for (const val of set) {
console.log(`Set: ${val}`);
}
// Set: 10
// Set: 20
// Set: 30
统一转成数组再遍历(兼顾类型一致性)
如果希望 Map 和 Set 都产出“单一值”或“统一结构”,可主动调用对应方法:
立即学习“Java免费学习笔记(深入)”;
- 要只取值:用
map.values()或set.values(),两者都返回Iterable - 要统一为键值对:把
Set手动映射成[[value, value]]形式,或用Array.from(set, v => [v, v]) - 转数组后操作更灵活:
Array.from(map)得到[[k,v], [k,v]];Array.from(set)得到[v, v, v]
配合解构与扩展运算符实现简洁写法
利用迭代器的可消费性,能写出更紧凑的代码:
- 快速提取 Map 的所有键:
const keys = [...map.keys()] - 合并多个 Set:
new Set([...set1, ...set2]) - 用解构获取前几项:
const [[firstKey, firstVal], [secondKey, secondVal]] = map; - 过滤后重建 Map:
new Map([...map].filter(([k]) => k.startsWith('a')))
不复杂但容易忽略:Map 和 Set 的默认迭代行为虽不同,但都遵循迭代器协议,因此能天然融入 JavaScript 的迭代生态,无需封装适配层就能协同工作。


















