JSON и данные
JSON — это текстовый формат обмена данными, а не подмножество JavaScript, хотя синтаксис похож. Отсюда главная мысль темы — сериализация в JSON теряет всё, чему в формате нет места: undefined, функции, символы, даты, Map/Set, а на циклах и BigInt вовсе падает. Понимать, что именно теряется, важнее, чем помнить сигнатуры.
Вокруг двух функций — JSON.stringify и JSON.parse — строится всё остальное: их аргументы replacer/reviver дают контроль над преобразованием, JSON-round-trip даёт быстрый (но lossy) глубокий клон, а eval — устаревший и опасный способ «оживить» текст, которого следует избегать. Полная карта — в слоях ниже.
Карта темы
- Основы JSON — что такое JSON, какие типы он допускает и чего в нём быть не может.
- Сериализация —
JSON.stringify,replacer,toJSON, отступ и что молча выбрасывается. - Разбор —
JSON.parse,reviverиSyntaxErrorна невалидном вводе. - Глубокое клонирование — JSON-round-trip против
structuredCloneи ручного клона. - Опасности eval — почему
evalопасен и чем его заменить.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Ждать, что stringify сохранит функции и undefined | В объекте такие ключи выбрасываются, в массиве становятся null |
| Сериализовать объект с циклом | JSON.stringify бросает TypeError |
Сериализовать BigInt | Тоже TypeError — у JSON нет типа для него |
Клонировать через JSON и ждать сохранности Date/Map | Date станет строкой, Map/Set — пустым {} |
Считать JSON.parse безопасным на любом вводе | Невалидный JSON бросает SyntaxError — нужен try/catch |
Использовать eval для разбора данных | Инъекция кода и потеря оптимизаций — вместо этого JSON.parse |
Значение для собеседований
JSON спрашивают как проверку того, понимаете ли вы разницу между значением в памяти и его текстовым представлением, и знаете ли конкретные потери формата. Кандидат, который перечисляет, что именно теряет JSON.parse(JSON.stringify(x)) — функции, undefined, Date, циклы — сразу показывает глубину.
Что обычно проверяют:
- Какие типы JSON не умеет представить и как каждый «ломается».
- Что делает
JSON.stringifyс функцией,undefined,NaN,Infinity. - Как работает JSON-клон и какие у него подводные камни.
- Почему
evalопасен и что использовать вместо него.
Типичный неверный ответ: «JSON.parse(JSON.stringify(obj)) — идеальный глубокий клон». Нет — он теряет функции и undefined, портит Date и Map, падает на циклах и BigInt; для честного клона есть structuredClone.