Map需转为二维数组再JSON序列化存入LocalStorage,读取时用JSON.parse还原为数组并传入new Map()构造函数;注意key不能为函数/undefined/NaN,value类型如Date会丢失。

Map 对象不能直接存入 LocalStorage,因为 LocalStorage 只支持字符串。必须先将其序列化为 JSON 字符串,而 Map 本身没有内置的 toJSON 方法,也不能被 JSON.stringify 直接处理。所以需要手动转换为可序列化的格式(如数组或普通对象),再存入;读取时再还原为 Map。
✅ 序列化:Map → 可存储的 JSON 字符串
推荐将 Map 转为二维数组 [[key, value], [key, value], ...],这是最直观、键类型兼容性最好的方式(支持字符串、数字甚至 Symbol 以外的原始类型作为 key):
const myMap = new Map([['name', 'Alice'], [42, 'answer']]);
const serialized = JSON.stringify(Array.from(myMap));
localStorage.setItem('myMapData', serialized);
✅ 反序列化:JSON 字符串 → Map
从 LocalStorage 读出后,用 JSON.parse 得到数组,再传给 new Map() 构造函数即可还原:
const saved = localStorage.getItem('myMapData');
const restoredMap = saved ? new Map(JSON.parse(saved)) : new Map();
console.log(restoredMap.get('name')); // 'Alice'
console.log(restoredMap.get(42)); // 'answer'
⚠️ 注意事项与边界情况
以下几点容易踩坑,需特别留意:
立即学习“Java免费学习笔记(深入)”;
-
key 为函数、undefined、NaN 或循环引用时无法正确保存 —— 这些值在
JSON.stringify中会被忽略或转为null,Map 还原后丢失;建议只对简单键值(字符串、数字、布尔、null)使用该方案。 -
日期、正则、Set 等对象作为 value 会丢失类型 ——
JSON.stringify(new Date())得到的是字符串,还原后是 string 不是 Date;如需保留类型,需额外自定义序列化逻辑(例如用toJSON方法或标记字段)。 -
避免用 Object 代替 Array 来序列化 Map —— 比如
Object.fromEntries(myMap)会强制 key 转为字符串,导致myMap.set(42, 'a')和myMap.set('42', 'b')冲突(都变成{"42": "b"})。
? 小技巧:封装成工具函数
可封装两个复用函数,让操作更安全简洁:
const mapToStorage = (map) => JSON.stringify(Array.from(map));
const storageToMap = (str) => str ? new Map(JSON.parse(str)) : new Map();
// 使用示例
localStorage.setItem('cart', mapToStorage(cartMap));
const cartMap = storageToMap(localStorage.getItem('cart'));


















