localStorage.setItem只能存字符串,因接口强制调用String()转换非字符串值;存对象须JSON.stringify()序列化,取时用JSON.parse()解析并加try/catch容错。

localStorage.setItem 为什么只能存字符串
localStorage.setItem 的第二个参数会被强制转成字符串,哪怕你传的是数字、布尔值或对象,底层调用的都是 String()。比如 localStorage.setItem('count', 42) 实际存进去的是字符串 "42",不是数字类型。这导致读取后直接用 === 比较原始值会失败——localStorage.getItem('count') === 42 是 false。
存对象或复杂数据必须 JSON.stringify
想存对象、数组、日期等非字符串数据,必须手动序列化。常见错误是直接传对象:localStorage.setItem('user', { name: 'Alice' }),结果存进去的是 "[object Object]",完全不可用。
正确做法:
- 存的时候用
JSON.stringify():localStorage.setItem('user', JSON.stringify({ name: 'Alice', age: 30 })) - 取的时候用
JSON.parse():const user = JSON.parse(localStorage.getItem('user')) - 加 try/catch 防止解析失败(比如手动删改过 localStorage 内容):
try { ... } catch (e) { /* 返回默认值 */ }
setItem 报错 "QuotaExceededError" 怎么办
浏览器对每个域名的 localStorage 有容量限制(通常 5–10MB),但更常见的是触发限制的不是体积,而是单次写入时字符串长度超限(尤其在旧版 Safari 或 iOS WebView 中)。错误信息是:DOMException: QuotaExceededError。
排查和应对:
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- 先检查要存的字符串长度:
console.log(JSON.stringify(data).length) - 避免存日志、大段 HTML、Base64 图片等原始数据;优先压缩或拆分
- 不要反复
setItem同一个 key 大量小数据(如循环里存每条消息),改用一次拼接再存 - 可降级到
sessionStorage或 IndexedDB(如果真需要存大量结构化数据)
setItem 后立即 getItem 读不到新值?
正常情况下不会——setItem 是同步操作,执行完就能读。但如果在 iframe、跨域子页面、或 Service Worker 环境中调用,可能因作用域隔离导致读不到。另外,有些浏览器扩展(如某些隐私模式插件)会拦截或清空 localStorage。
验证是否生效的可靠方式:
- 打开浏览器开发者工具 → Application → Storage → Local Storage,看对应 key 是否存在且值正确
- 确保没在无痕窗口或禁用第三方 cookie 的设置下测试
- 注意大小写:
setItem('Token', 'abc')和getItem('token')读不到,key 是严格区分大小写的
真正容易被忽略的是:localStorage 只支持同源访问,HTTP 和 HTTPS 视为不同源,localhost 和 127.0.0.1 也互不相通。换了个端口或协议,就得重存。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










