面试官:sessionStorage 可以在多个 tab 间共享数据吗?

2,133 阅读3分钟

原文地址:medium.com/javascript-…

原文作者:fatfish

最近,我的一个朋友在面试中被一个有关 sessionStorage 的问题难倒了。

我得承认,我对这块不是很熟悉。大家知道这个问题的答案吗?

sessionStorage 可以在多个 tab 间共享数据吗?

关于面试的过程

问题 1:“你知道 localStorage 和 sessionStorage 的区别吗?”

我朋友他感到很高兴,因为这是任何一个前端工程师都知道的知识点。

  1. localStorage 的数据是永久的,只要我们没有主动去清除它,数据就会一直存在。
  2. 关闭一个 tab 或者窗口时会结束会话并清除在 sessionStorage 中保存的对象。

问题 2:“可以在同源下共享 localStorage 的数据吗?”

我朋友:“这也是一个简单的问题!数据可以在同一个网站的不同的 tab 或者窗口中共享”

// Let's try to set a name in window 1 page 1
localStorage.setItem('name', 'fatfish')
// We try to read the current name in window 2 page 2
localStorage.getItem('name') // fatfish

问题 3:“你回答的非常不错,我想要问多你一个问题,请问可以在多个 tab 之间共享 sessionStorage 的数据吗?”

我朋友:“不可以,每个窗口或者 tab 都有各自的 sessionStorage,不可以在它们之间共享数据”

面试官:“你确定真的是这样吗?”

我朋友:“额,我不确定,可能吧!”

可能我的朋友会因为这个问题错过了这个 offer,但是作为一个开发者,我们需要不断的提升我们的知识和技能。

什么是 sessionStorage?

(来自 MDN)只读 sessionStorage 属性访问当前源的会话存储对象。sessionStorage 和 localStorage 有点类似;区别在于 localStorage 中的数据不会过期,而 sessionStorage 中的数据会在页面会话结束时清除掉。

  1. 每当文档加载到浏览器的具体 tab 后,唯一的页面会话就会生成并分配给这个具体的 tab。这个页面会话仅对具体的 tab 生效。
  2. 只要这个 tab 或者浏览器是打开的,页面会话就会一直存在,并且在页面重新加载和恢复后仍然存在。
  3. 在一个新的 tab 或者窗口打开页面就会创建一个具有顶级浏览器上下文的新 session ,这与 session cookie 的工作方式不同。
  4. 在多个 tab 或者窗口中打开相同的 URL 会为每个 tab 或者窗口创建 sessionStorage。
  5. 复制 tab 会将这个 tab 的 sessionStorage 也复制到这个新的 tab 中。

请注意第三点!我们可以从中找到答案!

假设我们在 medium.com/page/1 写了这样一段代码:

btn.addEventListener('click', () => {
  window.sessionStorage.setItem('name', 'fatfish')
  window.open('https://medium.com/page/2')
})

我可以在 medium.com/page/2 得到 name 的值吗?

console.log(window.sessionStorage.getItem('name')) // null or fatfish?

是的,答案是 fatfish。所以我们可以确定 sessionStorage 可以在多个 tab 中共享数据吗?

最终答案

让我们在 medium.com/page/1 再次尝试执行这段代码:

window.sessionStorage.setItem('name', 'medium')
window.sessionStorage.setItem('age', '1000')

如果 sessionStorage 可以在不同的窗口或者 tab 间共享数据,那么 medium.com/page/2

就可以获得 nameage 的最新值

console.log(window.sessionStorage.getItem('name')) // 111
console.log(window.sessionStorage.getItem('age')) // null

所以我们可以得出结论:sessionStorage 不可以在多个窗口或者 tab 间共享数据,但是当新的页面是通过 window.open 或者链接的形式打开的,那么新的页面就会复制上一个页面的 sessionStorage 到新的页面中。