Há um caso de uso muito específico no qual qualquer sugestão para usar sessionStorage em vez de localStorage realmente não ajuda. O caso de uso seria algo tão simples quanto ter algo armazenado enquanto você tiver pelo menos uma guia aberta, mas a invalidará se você fechar a última guia restante. Se você precisar que seus valores sejam salvos em guias e janelas, o sessionStorage não o ajudará, a menos que você complique sua vida com os ouvintes, como eu tentei. Enquanto isso, o localStorage seria perfeito para isso, mas faz o trabalho "muito bem", pois seus dados estarão esperando lá, mesmo após a reinicialização do navegador. Acabei usando um código e uma lógica personalizados que aproveitam os dois.
Prefiro explicar do que dar código. Primeiro armazene o que você precisa no localStorage e, em seguida, também no localStorage, crie um contador que conterá o número de guias que você abriu. Isso será aumentado toda vez que a página for carregada e diminuído toda vez que a página for descarregada. Você pode escolher aqui os eventos a serem usados, eu sugiro 'carregar' e 'descarregar'. No momento em que você descarrega, você precisa executar as tarefas de limpeza que deseja quando o contador chegar a 0, o que significa que você está fechando a última guia. Aí vem a parte complicada: eu não encontrei uma maneira confiável e genérica de diferenciar uma recarga ou navegação de página dentro da página e o fechamento da guia. Portanto, se os dados armazenados não forem algo que você possa reconstruir em carga após verificar se esta é sua primeira guia, não será possível removê-lo a cada atualização. Em vez disso, você precisa armazenar um sinalizador no sessionStorage a cada carregamento antes de aumentar o contador de guias. Antes de armazenar esse valor, você pode verificar se ele já possui um valor e, caso contrário, isso significa que você está carregando nesta sessão pela primeira vez, o que significa que você pode fazer a limpeza em carga, se isso o valor não está definido e o contador é 0.