localStorage只能存储字符串,存对象需JSON.stringify(),读取后需JSON.parse()并判空;其作用域为完整origin(协议+域名+端口),不跨域也不跨协议;删除应避免clear(),优先用removeItem()精准清理。

localStorage.setItem() 写入数据前必须转成字符串
localStorage 只接受 string 类型的值,直接存对象或数组会变成 [object Object] 或 ,,,,读出来就废了。常见错误是:localStorage.setItem('user', {name: 'Alice'})——这行代码看着没报错,但实际存进去的是 [object Object]。
正确做法是用 JSON.stringify() 序列化:
localStorage.setItem('user', JSON.stringify({name: 'Alice', age: 28}));
注意:undefined、函数、Date 对象、RegExp 等无法被 JSON.stringify() 正常处理,存之前得手动转换(比如 new Date().toISOString())。
localStorage.getItem() 读取后记得 JSON.parse()
读出来的永远是字符串,不解析就直接当对象用,会出各种奇怪问题,比如 user.name 是 undefined,但 typeof user 却是 string。
立即学习“前端免费学习笔记(深入)”;
安全读取模式:
const userStr = localStorage.getItem('user');
const user = userStr ? JSON.parse(userStr) : null;
加空值判断很重要——用户第一次访问时 getItem() 返回 null,直接 JSON.parse(null) 会报 SyntaxError。
localStorage 在页面刷新后依然存在,但不跨域也不跨协议
这是本地存储最常被误解的一点:它绑定在完整的 origin 上,即 协议 + 域名 + 端口。比如:
-
http://localhost:3000和http://localhost:3001是两个独立的存储空间 -
https://example.com和http://example.com互不可见 -
file:///协议下大多数浏览器会禁用localStorage(Chrome 直接报SecurityError)
开发时如果用双击 HTML 文件方式打开,localStorage 很可能根本不起作用——必须起一个本地服务(比如 python -m http.server)。
删数据别只靠 clear(),按需用 removeItem()
localStorage.clear() 是“一键清空”,适合调试,但上线后千万别写在生产逻辑里——一不小心就把用户所有偏好设置全干掉了。
更稳妥的做法是精准删除:
- 单个键:
localStorage.removeItem('theme') - 多个键:自己封装循环,比如
['cart', 'recentSearch'].forEach(key => localStorage.removeItem(key)) - 想清空但留一部分?先读出来,过滤再重写:
const keep = ['token', 'userId']; const all = {...}; Object.keys(all).filter(k => !keep.includes(k)).forEach(k => localStorage.removeItem(k))
另外注意:localStorage 没有过期机制,存进去的东西除非手动删或用户清除浏览数据,否则一直都在——敏感信息(如 token)别长期裸存。










