for...of 是遍历 Map 键值对最直观高效的方式,直接解构 [key, value],保持插入顺序且不污染原型链;entries() 语义更明确;forEach 适合函数式风格;应避免 for...in、Array.from 和 Object.keys 等低效写法。

用 for...of 遍历最直观
Map 原生支持迭代协议,for...of 是遍历所有键值对最简洁、性能也足够好的方式。它直接返回一个包含 [key, value] 的数组解构项,适合需要同时处理键和值的场景。
- 写法干净:不需要额外调用方法,语义清晰
- 保持插入顺序:按你 set 的先后顺序逐个访问,这点比普通对象可靠得多
- 不依赖原型链:不会意外遍历到 Object.prototype 上的属性
示例:
const map = new Map([['a', 1], ['b', 2], [{} , 'obj']]);
for (const [key, value] of map) {
console.log(key, value);
}
用 entries() + for...of 更明确语义
map.entries() 返回一个迭代器,专门用于遍历键值对。虽然效果和直接 for...of 一样,但显式调用 entries() 能让代码意图更清晰,尤其在团队协作或复杂逻辑中。
- 适合与其他迭代器方法组合使用,比如配合 Array.from() 转成数组再处理
- 可嵌套在其他循环结构中,便于条件过滤或提前退出
- 和 keys()、values() 形成统一接口风格,降低认知负担
示例:
for (const entry of map.entries()) {
console.log('键:', entry[0], '值:', entry[1]);
}
forEach 方法适合函数式风格
如果你习惯回调风格或需要复用已有逻辑,map.forEach(callback) 是不错的选择。它自动传入 value、key 和当前 map 实例,省去解构步骤。
- 天然支持 this 绑定,方便在类方法中使用
- 无法用 break 或 continue 中断,但可用 return 跳过单次迭代
- 不返回新数组,纯副作用操作,语义上更“专注执行”
示例:
map.forEach((value, key) => {
if (typeof key === 'string') {
console.log(`字符串键 ${key} 对应 ${value}`);
}
});
避免常见低效写法
有些做法看似可行,实则绕路或有隐患:
- 别用 for...in 遍历 Map —— 它是为普通对象设计的,Map 没有可枚举属性,会遍历不到任何内容
- 别反复调用 Array.from(map) 再遍历 —— 创建中间数组浪费内存,小数据看不出,大数据量时明显拖慢
- 别把 Map 当 Object 用:Object.keys(map) 返回空数组,因为 Map 不是普通对象,没有自有字符串键











