array.from(map) 或 [...map] 可将 map 转为二维数组,结果为浅拷贝;object.fromentries(map) 是推荐转对象方式,但会丢失非字符串键(如 symbol)且重复键后覆盖。

用 Array.from() 或展开运算符转成二维数组
Map 实例本身不支持直接展开或 JSON.stringify(),但它的迭代器默认产出 [key, value] 形式的数组项,所以最直白的转换方式就是利用这一特性:
-
Array.from(map)是最稳妥的选择,兼容性好(IE11+),且不会跳过空位 -
[...map]更简洁,但只在支持展开语法的环境(ES2015+)中可用;如果 Map 很大,展开可能带来轻微内存压力 - 注意:结果是浅拷贝二维数组,内部 key/value 本身不会被深复制
示例:
const m = new Map([['a', 1], ['b', {x: 2}]]);
console.log(Array.from(m)); // [['a', 1], ['b', {x: 2}]]
console.log([...m]); // 同上
用 Object.fromEntries() 转成普通对象
这是目前最推荐、语义最清晰的方式——Object.fromEntries() 专为接收键值对可迭代对象(如 Map)而设计,会自动把每项 [key, value] 映射为对象属性:
- 要求环境支持 ES2019(Node.js ≥ 12,现代浏览器基本都支持)
- 如果 Map 的 key 不是字符串或 symbol,会被强制转为字符串(例如
new Map([[{} , 1]])→{'[object Object]': 1}) - 遇到重复 key(转字符串后相同)时,后者会覆盖前者,行为和对象字面量一致
示例:
const m = new Map([['name', 'Alice'], [Symbol('id'), 42]]);
console.log(Object.fromEntries(m)); // { name: 'Alice' }(Symbol key 被忽略)
手动遍历构建对象时要注意 key 类型和原型污染
当需要兼容老环境,或必须保留非字符串 key(比如 Symbol、数字、对象)时,不能依赖 Object.fromEntries(),得手写循环。但这里容易踩坑:
- 别用
for...in—— 它遍历的是对象自有 + 继承属性,且不保证顺序,完全不适用于 Map - 务必用
for...of或map.forEach()遍历 Map 迭代器 - 若 key 是对象或函数,作为对象属性名会被转成
[object Object],导致冲突;此时应考虑是否真需要把它当 key,还是该换数据结构 - 避免直接赋值到
{}上造成原型污染,比如 key 是__proto__或constructor;更安全的做法是用Object.defineProperty(obj, key, {value, enumerable: true})
性能与边界情况提醒
转换本身开销很小,真正影响性能的是后续使用方式:
- 二维数组适合需要按索引操作、排序、filter/map 的场景;但查 key 要
findIndex,O(n) 时间 - 普通对象适合高频按 key 读取(O(1)),但无法保证插入顺序(ES2015+ 规范已保证,但旧引擎或某些 polyfill 可能不守序)
- Map 原生保持插入顺序,且 key 可为任意类型;如果转换只是为了“让其他函数能接收”,不如直接传 Map——很多现代 API(如
URLSearchParams、Headers)已原生接受 Map
真正容易被忽略的一点:转换不是免费的。如果你只是临时读几个值,反复调用 Array.from(map) 或 Object.fromEntries(map),不如直接用 map.get(key) 或 map.entries() 迭代器。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











