map需转为普通对象才能json.stringify,推荐object.fromentries()(es2019+),一行搞定;键非字符串/数字/symbol会失真;老环境可用for...of;嵌套map、date等需递归处理;发送前须校验序列化安全性。

Map 不能直接 JSON.stringify,必须先转成普通对象(plain object)才能用于网络传输或 localStorage 等场景。
用 Object.fromEntries() 最简洁
这是现代 JavaScript 中最推荐的方式,兼容性好(ES2019+),一行搞定:
const map = new Map([['name', 'Alice'], ['age', 25], ['city', 'Beijing']]);
const obj = Object.fromEntries(map);
// { name: 'Alice', age: 25, city: 'Beijing' }
- Map 的每个键值对会被自动展开为 [key, value] 数组,正好匹配 Object.fromEntries 的输入格式
- 注意:Map 的 key 必须是字符串、数字或 symbol;如果 key 是对象或函数,转成对象后会变成 "[object Object]" 或 "function () {}",丢失原始引用
手动遍历构造对象(兼容老环境)
如果需要支持 IE 或旧版 Node.js,可用 for...of 遍历 Map:
const map = new Map([['id', 1001], ['status', 'active']]);
const obj = {};
for (const [key, value] of map) {
obj[key] = value;
}
// { id: 1001, status: 'active' }
- 适合需要控制序列化逻辑的场景,比如过滤某些 key 或转换 value 类型
- 可配合 typeof 或 instanceof 判断 key 类型,避免非字符串 key 导致意外覆盖
处理嵌套 Map 或特殊类型
如果 Map 的 value 本身也是 Map、Set 或 Date 等类型,Object.fromEntries 不会自动深转换:
const map = new Map([['user', new Map([['level', 5]])]]);
const obj = Object.fromEntries(map);
// { user: Map(1) } → JSON.stringify(obj) 时 user 会变成 {}
- 需递归处理:检查 value 是否为 Map,是则先调用 Object.fromEntries(value)
- Date、RegExp、undefined 等无法被 JSON 序列化的值,也要提前转成字符串或 null
- 建议封装一个工具函数,统一处理常见不可序列化类型
发送前记得校验和序列化
转成对象后,别忘了验证是否能被 JSON 安全处理:
const obj = Object.fromEntries(map);
try {
const json = JSON.stringify(obj);
fetch('/api', {
method: 'POST',
body: json,
headers: { 'Content-Type': 'application/json' }
});
} catch (e) {
console.error('序列化失败,检查是否有 undefined、function 或循环引用', e);
}
- JSON.stringify 会忽略 undefined、function、Symbol 和 BigInt,必要时提前替换为 null 或字符串
- 若 Map 键是 symbol,Object.fromEntries 会跳过它(symbol 键不参与迭代),需单独处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











