> Какие данные (примитивы или объекты) можно хранить в localStorage (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: IT-One

Стек: JavaScript

> Пример ответа

Короткий ответ

В localStorage можно хранить только строки. Любые данные (числа, объекты, массивы, булевы значения) автоматически преобразуются в строку через toString(). Для хранения сложных структур необходимо использовать JSON.stringify() при записи и JSON.parse() при чтении. Размер хранилища ограничен 5-10 МБ в зависимости от браузера.

Подробное объяснение

localStorage - это часть Web Storage API, которая предоставляет ключ-значение хранилище в браузере. Значением может быть только строка. При попытке сохранить примитив (число, null, undefined, boolean) он неявно приводится к строке. Например, localStorage.setItem('num', 123) сохранит строку "123". Объекты и массивы преобразуются в "[object Object]" или "null" для null, что делает данные бесполезными без сериализации.

Исключение: Symbol и BigInt - они не поддерживаются и вызовут ошибку или неявное приведение. undefined превращается в строку "undefined".

На практике

  • Всегда используйте JSON.stringify() для объектов и массивов, и JSON.parse() для восстановления.
  • Проверяйте наличие ключа перед чтением, чтобы избежать null (если ключа нет, возвращается null).
  • Учитывайте лимит в 5-10 МБ - для больших данных используйте IndexedDB.
  • Не храните чувствительные данные (пароли, токены) - localStorage доступен через JavaScript и не защищён от XSS.
  • Для синхронизации между вкладками используйте событие storage.

Пример кода

JAVASCRIPT
// Сохранение объекта
const user = { name: 'Alice', age: 30 };
localStorage.setItem('user', JSON.stringify(user));
// Чтение объекта
const storedUser = JSON.parse(localStorage.getItem('user'));
console.log(storedUser.name); // 'Alice'
// Сохранение числа (автоматически станет строкой)
localStorage.setItem('count', 42);
console.log(typeof localStorage.getItem('count')); // 'string'
// Ошибка при прямом сохранении объекта
localStorage.setItem('bad', { a: 1 });
console.log(localStorage.getItem('bad')); // '[object Object]'

Как отвечать на собеседовании

Начните с ключевого факта: только строки. Затем объясните механизм приведения типов и необходимость JSON-сериализации для сложных данных. Упомяните ограничения по размеру и безопасности. Если спросят про альтернативы, скажите про sessionStorage (аналогично, но очищается при закрытии вкладки) и IndexedDB (для больших объёмов). Избегайте излишних деталей про внутреннюю реализацию браузеров.

Что проверяет интервьюер

  • Понимание типов данных в JavaScript и неявного приведения.
  • Знание API localStorage и его ограничений.
  • Умение работать с JSON-сериализацией.
  • Осведомлённость о безопасности (XSS) и альтернативных хранилищах.

Типичные ошибки

  • Попытка сохранить объект напрямую без JSON.stringify() - получается "[object Object]".
  • Забывают парсить строку обратно в объект при чтении.
  • Путают localStorage с sessionStorage или cookies.
  • Считают, что localStorage хранит данные в бинарном виде или поддерживает другие типы.
  • Не проверяют существование ключа перед парсингом, что вызывает ошибку при null.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью