Browser API → Хранилища → LocalStorage, SessionStorage
Основная идея
localStorage и sessionStorage — два типа веб-хранилищ с идентичным API, но разным временем жизни данных. localStorage сохраняет данные навсегда, sessionStorage — только до закрытия вкладки.
Ключевые аспекты
localStorage — данные сохраняются бессрочно, доступны во всех вкладках одного origin
sessionStorage — данные удаляются при закрытии вкладки, изолированы для каждой вкладки
Общий API — оба используют методы setItem(), getItem(), removeItem(), clear()
Объём — оба предоставляют 5-10 МБ (зависит от браузера)
Same-origin — данные доступны только для того же протокола, домена и порта
Плюсы localStorage
Данные сохраняются между сессиями
Доступны во всех вкладках
Подходит для долгосрочных настроек
Плюсы sessionStorage
Автоматическая очистка при закрытии вкладки
Изоляция данных между вкладками
Безопаснее для временных данных
Частые ошибки на собеседованиях
Считают, что sessionStorage удаляется при обновлении страницы (нет, только при закрытии вкладки)
Путают изоляцию: localStorage общий для вкладок, sessionStorage — нет
Забывают, что дублирование вкладки копирует sessionStorage
Не знают, что sessionStorage сохраняется при навигации внутри вкладки
Введение и проблематика
При работе с клиентскими данными важно понимать разницу между localStorage и sessionStorage. Выбор неправильного типа хранилища может привести к утечке данных между сессиями или, наоборот, к потере важных настроек.
Оба хранилища появились в HTML5 как часть Web Storage API. Они имеют идентичный интерфейс, но кардинально отличаются по поведению.
Когда какое хранилище использовать?
Сценарий
Рекомендация
Тема оформления
localStorage
Языковые настройки
localStorage
Данные формы (черновик)
sessionStorage
Временные фильтры
sessionStorage
Корзина покупок
localStorage или sessionStorage (зависит от бизнес-логики)
Базовая теория
Главное отличие: время жизни данных
graphTBsubgraphlocalStorage A[Данные сохраняются]--> B[Между сессиями] B --> C[До ручного удаления]endsubgraphsessionStorage D[Данные сохраняются]--> E[До закрытия вкладки] E --> F[Автоудаление]end
Сравнительная таблица
Характеристика
localStorage
sessionStorage
Время жизни
Бессрочно
До закрытия вкладки
Область видимости
Все вкладки одного origin
Только текущая вкладка
При обновлении страницы
Сохраняется
Сохраняется
При закрытии браузера
Сохраняется
Удаляется
При дублировании вкладки
Общие данные
Копируется в новую вкладку
Объём
5-10 МБ
5-10 МБ
⚠️
При дублировании вкладки (Ctrl+Shift+T или правый клик → "Дублировать") sessionStorage копируется в новую вкладку, но дальше они работают независимо.
Практические примеры
localStorage: сохранение настроек пользователя
js
// Сохранение темы при выборе пользователемfunctionsetTheme(theme) {document.body.className = theme;localStorage.setItem('theme', theme);}// Восстановление темы при загрузке страницыfunctionloadTheme() {constsavedTheme=localStorage.getItem('theme') ||'light';document.body.className = savedTheme;}// Вызов при загрузкеloadTheme();
sessionStorage: временные данные формы
js
// Автосохранение данных формы при вводеconstform=document.querySelector('#registration-form');form.addEventListener('input', (e) => {constformData= { name:form.name.value, email:form.email.value, message:form.message.value };sessionStorage.setItem('formDraft',JSON.stringify(formData));});// Восстановление при случайном обновлении страницыfunctionrestoreFormData() {constdraft=sessionStorage.getItem('formDraft');if (draft) {constdata=JSON.parse(draft);form.name.value =data.name ||'';form.email.value =data.email ||'';form.message.value =data.message ||''; }}// Очистка после успешной отправкиform.addEventListener('submit', () => {sessionStorage.removeItem('formDraft');});
Сравнение поведения
js
// Вкладка 1localStorage.setItem('user','Иван');// Вкладка 2 (того же сайта)console.log(localStorage.getItem('user')); // 'Иван'// После закрытия и открытия браузераconsole.log(localStorage.getItem('user')); // 'Иван'
Пограничные кейсы
⚠️
Навигация в пределах вкладки: sessionStorage сохраняется при переходе между страницами одного сайта в той же вкладке. Это позволяет передавать данные между страницами.
Событие storage: Работает только для localStorage. Позволяет синхронизировать данные между вкладками.
js
// Событие storage срабатывает только для localStorage// и только в ДРУГИХ вкладках (не в той, где произошло изменение)window.addEventListener('storage', (event) => {if (event.key ==='user') {console.log('Пользователь изменился:',event.newValue); }});