sessionStorage 生命周期仅限当前标签页,关闭即清空;作用域为单个 tab,同源新 tab 或 window.open 的新窗口均创建独立实例,数据不共享。
sessionStorage 是浏览器为当前标签页“专属分配”的临时存储空间,关掉这个标签页,数据立刻消失;localStorage 则是同源下所有标签页共享的“长期保险柜”,不手动删就一直留着。
它只属于你当前打开的这一个 tab(或窗口),哪怕你从页面 A 用 window.location.href 跳到页面 B,或者刷新、重载、甚至崩溃后恢复,数据都还在。但只要你关掉这个 tab,sessionStorage 就被清空——连带里面存的 token、表单草稿、筛选条件,全没了。
sessionStorage,彼此完全不可见window.open(url, '_blank') 打开的新窗口,也拥有独立的 sessionStorage,不是继承父窗口的两者都用 setItem()、getItem()、removeItem()、clear(),但调用结果取决于“谁在调用”和“在哪调用”:
https://example.com/a.html 存了 localStorage.setItem('theme', 'dark'),那么同源下任意其他 tab(比如 /b.html 或新打开的 /c.html)都能立刻读到 'dark'
sessionStorage.setItem('draft', 'hello world'),只有当前 tab 能读,换一个 tab 就是 null
JSON.stringify(),取出来再 JSON.parse();直接存 {name: 'Alice'} 会变成 '[object Object]'
写代码前快速问自己:
localStorage;不
需要 → 优先考虑 sessionStorage
localStorage;不要 → sessionStorage 更安全(生命周期短,攻击窗口小)HttpOnly cookie + 后端验证,别只靠 sessionStorage 做信任依据常见错误:在列表页存 sessionStorage.setItem('selectedId', '123'),然后跳转到详情页想读取——结果是 null。为什么?因为你用了新 tab 打开(target="_blank"),或者用户手动复制链接新开 tab,那已经是全新会话。
正确做法:
location.href = '/detail?id=123' 或 history.pushState)localStorage(注意清理时机)、或服务端 session 关联const id = sessionStorage.getItem('selectedId');
if (!id) {
console.warn('sessionStorage missing: selectedId');
// fallback to query param or redirect
}最常被忽略的一点:sessionStorage 不是“会话级状态同步机制”,它没有跨 tab 通信能力;而 localStorage 虽然能共享,但修改不会触发当前页的 storage 事件——监听得在其他 tab 里写。