← Назад к вопросам

В каком формате хранятся данные в localStorage

1.0 Junior🔥 192 комментариев
#Браузер и сетевые технологии

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

В каком формате хранятся данные в localStorage

localStorage — это Web Storage API браузера, который позволяет сохранять данные на клиенте. Данные хранятся в виде пар ключ-значение, где оба элемента являются строками (string). Это критически важно понимать, так как многие разработчики забывают об этом ограничении.

Строковый формат хранения

localStorage хранит всё как текст (UTF-16 строки). Даже если вы попытаетесь сохранить объект или число, они будут автоматически преобразованы в строковое представление.

// Пример: что происходит при сохранении
localStorage.setItem('number', 42);
localStorage.setItem('boolean', true);
localStorage.setItem('object', { name: 'John' });

// При извлечении получаем СТРОКИ:
console.log(typeof localStorage.getItem('number'));   // 'string'
console.log(localStorage.getItem('number'));          // '42'
console.log(typeof localStorage.getItem('boolean'));  // 'string'
console.log(localStorage.getItem('boolean'));         // 'true'
console.log(localStorage.getItem('object'));          // '[object Object]'

Правильное сохранение сложных типов

Для сохранения объектов или массивов нужно использовать JSON.stringify() при сохранении и JSON.parse() при извлечении:

// Правильный способ работы с объектами
const user = {
  id: 1,
  name: 'Alice',
  email: 'alice@example.com',
  preferences: {
    theme: 'dark',
    notifications: true
  }
};

// Сохранение
localStorage.setItem('user', JSON.stringify(user));

// Извлечение и парсинг
const retrievedUser = JSON.parse(localStorage.getItem('user'));
console.log(retrievedUser.name); // 'Alice'
console.log(typeof retrievedUser.id); // 'number'

Практический пример с обработкой ошибок

// Хелпер функции для безопасной работы
const storageHelper = {
  set: (key, value) => {
    try {
      const serialized = typeof value === 'string' ? value : JSON.stringify(value);
      localStorage.setItem(key, serialized);
    } catch (error) {
      console.error('Ошибка при сохранении в localStorage:', error);
    }
  },
  
  get: (key, defaultValue = null) => {
    try {
      const item = localStorage.getItem(key);
      if (!item) return defaultValue;
      
      try {
        return JSON.parse(item);
      } catch {
        // Если парсинг не удался, возвращаем сырую строку
        return item;
      }
    } catch (error) {
      console.error('Ошибка при чтении из localStorage:', error);
      return defaultValue;
    }
  },
  
  remove: (key) => {
    try {
      localStorage.removeItem(key);
    } catch (error) {
      console.error('Ошибка при удалении из localStorage:', error);
    }
  }
};

// Использование
storageHelper.set('config', { timeout: 5000, retries: 3 });
const config = storageHelper.get('config'); // Объект, не строка

Ограничения хранилища

  • Размер: ~5-10 МБ на домен (зависит от браузера)
  • Формат: только строки
  • Синхронность: API синхронный, блокирует поток
  • Область видимости: одна вкладка на домен (для одного доменного имени)

sessionStorage vs localStorage

  • localStorage — данные остаются до явного удаления или очистки браузера
  • sessionStorage — данные удаляются при закрытии вкладки

Оба используют одинаковый строковый формат хранения.

Слушание изменений

// Событие срабатывает при изменении в другой вкладке
window.addEventListener('storage', (event) => {
  console.log(`${event.key} изменился с '${event.oldValue}' на '${event.newValue}'`);
  
  // Можно обновить UI при изменении данных
  if (event.key === 'theme') {
    const newTheme = JSON.parse(event.newValue);
    applyTheme(newTheme);
  }
});

Итоги

Ключевые моменты:

  • localStorage хранит только строки
  • Для сложных типов используй JSON.stringify() / JSON.parse()
  • Всегда оборачивай в try-catch для обработки ошибок
  • Помни об ограничении размера (~5-10 МБ)
  • В продакшене рассмотри IndexedDB для больших объёмов данных