localStorage存取需先用JSON.stringify()序列化再setItem,取值后须用JSON.parse()解析并加异常捕获;它不支持跨域、无过期机制,且数据始终为字符串类型。

localStorage 是浏览器提供的一种持久化键值对存储机制,数据在页面关闭甚至浏览器重启后依然存在,除非被手动清除或超出配额(通常为 5–10 MB)。
它不随 HTTP 请求发送,不支持跨域共享,只适用于同源(协议 + 域名 + 端口完全一致)的 JavaScript 脚本读写。
怎么用 setItem() 存字符串?
所有存入 localStorage 的值都会被自动转成字符串——这是最容易踩坑的地方。
-
localStorage.setItem('count', 42)→ 实际存的是"42",不是数字 -
localStorage.setItem('user', { name: 'Alice' })→ 存的是"[object Object]",不是对象 - 想存对象、数组、布尔值等非字符串类型,必须先用
JSON.stringify()
localStorage.setItem('user', JSON.stringify({ name: 'Alice', age: 30 }));
localStorage.setItem('isActive', JSON.stringify(true));怎么用 getItem() 安全取值?
取出的值永远是字符串,必须手动解析;如果键不存在,返回 null,不是 undefined。
立即学习“Java免费学习笔记(深入)”;
- 直接
JSON.parse(localStorage.getItem('user'))会报错,当值为空、损坏或根本没存过时 - 建议加一层容错处理
function getFromStorage(key) {
const raw = localStorage.getItem(key);
if (!raw) return null;
try {
return JSON.parse(raw);
} catch (e) {
console.warn(`Failed to parse localStorage item "${key}"`, e);
return null;
}
}
为什么 localStorage.removeItem() 和清空不等于“立即释放内存”?
调用 removeItem() 或 clear() 后,数据确实从存储中删除了,但以下情况仍可能造成误判:
- 多个标签页共享同一
localStorage:一个页面删了,其他同源页面里该键立刻变为null,但已缓存的变量不会自动更新 - 没有监听变化:无法感知其他标签页的修改,除非主动监听
storage事件 - 大体积数据(如 Base64 图片)即使删掉,也可能因浏览器延迟回收导致短暂内存占用偏高
window.addEventListener('storage', (e) => {
console.log('Storage changed:', e.key, e.newValue, e.oldValue);
});关键点就两条:存之前必须 JSON.stringify(),取之后必须 JSON.parse() 加异常捕获;别把它当数据库用——没事务、没查询、没过期时间,也别存敏感信息(XSS 可直接读取)。











