Какие данные (примитивы или объекты) можно хранить в localStorage
Что проверяют
Знаете ли вы, что localStorage хранит только строки, и что происходит, когда туда кладут что-то другое. Следом обычно спрашивают про лимит объёма, про безопасность и про альтернативы вроде IndexedDB.
Как отвечать
И ключи, и значения в localStorage это строки. Сохранить можно что угодно, но setItem молча приведёт значение к строке:
- число и булево:
setItem("n", 42)запишет"42", аgetItemвернёт строку. Обратно приводите явно:Number(...), сравнение с"true"; nullиundefined: превратятся в строки"null"и"undefined", а отсутствующий ключgetItemотдаёт настоящимnull;- объект: без сериализации сохранится
"[object Object]", массив[1, 2]станет"1,2". Поэтому объекты пишут черезJSON.stringifyи читают черезJSON.parse.
Покажите, что знаете пределы JSON: Date вернётся строкой в ISO-формате, Map и Set станут пустым объектом, функции и поля со значением undefined пропадут, NaN станет null, а BigInt и циклические ссылки бросят TypeError. Бинарные данные, Blob, большие массивы лучше хранить в IndexedDB: она работает со структурным клонированием и асинхронна.
Про ограничения: около 5 МБ на источник (origin), точная цифра зависит от браузера, при переполнении setItem бросает QuotaExceededError, поэтому запись оборачивают в try/catch. API синхронный и блокирует основной поток, в Web Worker его нет. Данные доступны любому скрипту страницы, так что токены и персональные данные туда не кладут: одна XSS, и они утекли.
Где спотыкаются
Сохраняют объект напрямую и потом не понимают, откуда в хранилище "[object Object]".
Читают без защиты: JSON.parse(localStorage.getItem("user")) упадёт на битой строке, которую оставила старая версия приложения. Нужны try/catch, значение по умолчанию и версия схемы в ключе.
Хранят в localStorage JWT и считают это безопасным. Для сессии надёжнее cookie с флагами HttpOnly, Secure и SameSite.