sessionStorage 和 localStorage 的关键区别在于生命周期和作用域:sessionStorage 仅在当前浏览器标签页会话期间有效,关闭标签即清除;localStorage 持久保存,除非手动清除。两者均以字符串键值对存储,容量约5–10MB,同源访问,不自动发送至服务器。
sessionStorage 的生命周期绑定到浏览器标签页(或窗口)的会话周期:页面关闭(包括刷新、跳转、关闭标签)后,只要不是主动调用 clear() 或 removeItem(),数据在当前标签页内始终存在;而 localStorage 会持久保留,除非手动清除或用户清空浏览器数据。注意:新开一个相同 URL 的标签页,sessionStorage 是完全隔离的——这常被误认为“没存进去”,其实是预期行为。常见错误现象:sessionStorage.setItem('user', 'alice') 后刷新页面取不到值?检查是否启用了无痕模式且禁用了 sessionStorage(极少数企业策略),或是否在 iframe 中跨域访问(会直接抛 SecurityError)。
sessionStorage 只接受字符串值;读取后需主动 JSON.parse()(如果存的是对象)。不要依赖未定义行为,比如直接存 undefined 或 function。实操建议:
JSON.stringify(),避免 TypeError: Converting circular structure to JSON
try...catch,防止后端返回格式异常或存储损坏导致解析失败if (typeof sessionStorage !== 'undefined'),兼容旧版 IE 或禁用 JS 的环境// 安全写入const saveUser = (user) => { try { sessionStorage.setItem('currentUser', JSON.stringify(user)); } catch (e) { console.warn('Failed to save to sessionStorage:', e); }};// 安全读取const loadUser = () => { try { const raw = sessionStorage.getItem('currentUser'); return raw ? JSON.parse(raw) : null; } catch (e) { console.warn('Failed to parse sessionStorage data:', e); return null; }};
localStorage 更符合“仅本次会话”的语义。使用场景举例:
sessionStorage 比反复传参或全局 store 更轻量sessionStorage 自动存活,无需监听 popstatesessionStorage.setItem('submitting', 'true'),成功后清除,页面刷新即失效,天然防重sessionStorage 不是万能临时仓。最大容量通常为 5–10MB(各浏览器不同),但实际建议单 key 控制在 1MB 内;超出会静默失败(setItem 抛 QuotaExceededError),且不会自动清理旧数据。另外,Safari 在隐私模式下会拒绝写入 sessionStorage(返回空字符串或抛错),必须兜底。关键提醒:
sessionStorage 的任何数据,它纯属前端便利机制