localStorage只能存字符串,对象必须用JSON.stringify()序列化后存储,读取时需用JSON.parse()并加try/catch防错,且key名严格区分大小写。

localStorage 只接受字符串,必须用 JSON.stringify
localStorage 的 setItem 方法第二个参数会被强制转成字符串,如果直接传入对象(比如 {name: "Alice", age: 30}),它会调用 toString(),结果是 [object Object]——存进去的是个没用的字符串,取出来也还原不了原始结构。
所以必须显式序列化:JSON.stringify() 是唯一可靠、标准、跨浏览器兼容的方式。
- ✅ 正确写法:
localStorage.setItem("user", JSON.stringify({name: "Alice", age: 30})) - ❌ 错误写法:
localStorage.setItem("user", {name: "Alice", age: 30})(存的是[object Object]) - ⚠️ 注意:如果对象含函数、undefined、Symbol、Date 实例、RegExp 等非 JSON 可序列化值,
JSON.stringify()会静默忽略它们(例如JSON.stringify({a: 1, b: undefined, c: () => {}})得到{"a":1})
取出来时必须用 JSON.parse 还原,且要防错
存的时候用了 JSON.stringify(),取的时候就得用 JSON.parse()。但别忘了:用户可能手动清空 localStorage、其他脚本误删、或之前存的不是合法 JSON(比如存过字符串 "hello" 或空值),直接 JSON.parse() 会抛 SyntaxError。
- ✅ 安全读取写法:
const raw = localStorage.getItem("user");<br>let user = null;<br>if (raw) {<br> try {<br> user = JSON.parse(raw);<br> } catch (e) {<br> console.warn("localStorage user data is invalid JSON", e);<br> }<br>} - ⚠️ 不要省略 try/catch —— 生产环境一旦出错就中断后续逻辑
- ⚠️
JSON.parse(null)报错,JSON.parse("")也报错,所以必须先判空再解析
遇到循环引用或特殊类型怎么办
JSON.stringify() 遇到循环引用(比如对象 A 有个属性指向自己)会直接抛 TypeError: Converting circular structure to JSON;Date、Map、Set、BigInt 等也无法原样序列化。
立即学习“前端免费学习笔记(深入)”;
- ✅ 简单绕过循环引用:用 replacer 函数跳过可疑属性
const cache = new WeakSet();<br>localStorage.setItem("data", JSON.stringify(obj, (key, value) => {<br> if (typeof value === "object" && value !== null) {<br> if (cache.has(value)) return undefined;<br> cache.add(value);<br> }<br> return value;<br>})); - ⚠️ 更稳妥的做法是提前清理数据:只存纯 POJO(Plain Old JavaScript Object),避免塞进 class 实例、DOM 节点、函数等
- ⚠️ 如果真需要存 Date,先转成 ISO 字符串:
date.toISOString();取回后再用new Date(str)恢复
中文、emoji、特殊字符没问题,但要注意大小写和 key 名一致性
JSON.stringify() 对 UTF-8 完全友好,中文、emoji、数学符号都可正常存取,无需额外编码。真正容易出问题的是 key 名拼写和大小写。
- ✅ 存:
localStorage.setItem("userInfo", JSON.stringify(data)) - ❌ 取:
JSON.parse(localStorage.getItem("userinfo"))→ 返回null(key 大小写不匹配) - ⚠️ localStorage 是区分大小写的,且没有“默认 key”概念;建议统一用小写下划线或驼峰,写完立刻检查存取 key 是否完全一致
- ⚠️ 浏览器开发者工具 Application → Storage → Local Storage 里可以直接看到所有 key,是排查 key 错误最快的方式



















