WebStorage 存取对象必须用 JSON.stringify() 和 JSON.parse() 转换,因其仅支持字符串;需处理 Date、Map、Set 等不可序列化类型,并注意 dataset 同样需 JSON 转换。

不能直接存,必须先用 JSON.stringify() 转成字符串,再交给 localStorage 或 sessionStorage;读取时再用 JSON.parse() 还原。这是硬性前提——WebStorage 只接受字符串值,任何对象、数组、日期、布尔甚至数字,都会被自动转成字符串,导致数据丢失或结构错乱。
基础操作:存数组和普通对象
这是最常见也最安全的用法,适用于不含函数、Date、undefined、RegExp 等特殊类型的纯数据结构:
- 存一个用户数组:
localStorage.setItem('users', JSON.stringify([{id:1,name:'张三'}, {id:2,name:'李四'}])) - 读取并还原:
const users = JSON.parse(localStorage.getItem('users') || '[]'); - 务必加
|| '[]'或try/catch,防止 getItem 返回null导致JSON.parse(null)报错
处理 Date、Map、Set 等不可序列化类型
原生 JSON.stringify() 会静默丢弃 Date 实例(只留字符串)、跳过 function 和 undefined、把 Map/Set 变成空对象或空数组。要保留语义,得靠自定义转换逻辑:
- 存
Date:在stringify时转 ISO 字符串,例如new Date().toISOString() - 存
Map:用Object.fromEntries(map)转成键值对对象;存Set:用Array.from(set)转成数组 - 写一个统一的
replacer函数,集中处理这些类型,避免每次手动转换
读取时还原类型,别只依赖 parse
JSON.parse() 永远只返回 plain object 或 array,不会自动变回 Date 或 Map。所以反序列化后需主动识别并重建:
立即学习“前端免费学习笔记(深入)”;
- 检测字段是否为 ISO 时间格式(如
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(str)),是则new Date(str) - 若存储时用了
Object.fromEntries(),读取后可用new Map(Object.entries(obj.mapData))还原 - 正则表达式可存
reg.toString()(如/abc/gi),读取后用new RegExp(regStr)构造
data-* 属性里存结构化数据也要走 JSON 流程
DOM 的 dataset 本质也是字符串容器,el.dataset.config = {a:1} 实际存的是 "[object Object]":
- 写入前必须
el.dataset.config = JSON.stringify({theme: 'dark', count: 5}) - 读取后必须
JSON.parse(el.dataset.config || '{}'),且注意中划线命名会自动转驼峰(data-user-id→dataset.userId) - 不适用于大量或深层嵌套数据,仅推荐存轻量配置或临时状态



















