localStorage和sessionStorage只能存储字符串,存对象需JSON.stringify()、取用需JSON.parse();localStorage永久保存,sessionStorage仅限当前标签页;二者均受同源策略限制,键名须为字符串且仅setItem/getItem可靠;容量约5–10MB,超限抛QuotaExceededError,私密模式下localStorage可能被禁用。

localStorage 和 sessionStorage 都只能存字符串,想存对象必须 JSON.stringify(),取出来得 JSON.parse();不这么做会静默失败或得到 "[object Object]"。
localStorage 和 sessionStorage 的生命周期差异
localStorage 数据永久保存,除非手动调用 localStorage.removeItem() 或清空浏览器数据;sessionStorage 只在当前标签页(tab)生命周期内有效,关闭该 tab 就自动清空,新开同地址 tab 也是空的。
注意:sessionStorage 不共享于同域下的其他 tab,哪怕 URL 完全一样——这点常被误认为“会继承”,实际不会。
它们都受同源策略限制
协议、域名、端口三者完全一致才算同源,才能互相读写。比如:
立即学习“Java免费学习笔记(深入)”;
-
https://a.com和http://a.com不同源(协议不同)→ 无法访问彼此的localStorage -
https://a.com:8080和https://a.com不同源(端口不同)→ 各自独立存储空间 -
https://sub.a.com和https://a.com不同源(子域不同)→ 互不可见
存取操作必须用字符串键名,且不能直接赋值
以下写法是错的:
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon
localStorage.myKey = 'value'; // ❌ 不报错但无效
正确方式只有两种:
localStorage.setItem('myKey', 'value')-
localStorage['myKey'] = 'value'(部分浏览器支持,但不推荐,行为不稳定)
读取也一样:localStorage.getItem('myKey') 是唯一可靠方式;localStorage.myKey 在某些场景下返回 undefined,尤其键名含特殊字符或与原生属性名冲突(如 localStorage.length 是只读属性)。
容量限制和错误处理容易被忽略
多数浏览器限制约 5–10MB(按字符串字节算),超限会抛 QuotaExceededError。但这个错误不会自动捕获,不加 try/catch 就可能中断后续逻辑。
建议写入前检查剩余空间(粗略估算)或封装一层安全写入函数:
function safeSet(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
} catch (e) {
if (e.name === 'QuotaExceededError') {
console.warn('localStorage quota exceeded');
}
}
}
另外,私密模式下部分浏览器会禁用 localStorage(直接抛异常),而 sessionStorage 通常仍可用——这点在无痕调试时容易卡住。










