PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Какие минусы у JSON.stringify?

Продвинутые темы

Минусы `JSON.stringify`: теряет функции, `undefined`, `Symbol`, `BigInt` (ошибка), портит `Date` (→ строка), не работает с `Map`/`Set`, падает на циклических ссылках, теряет точность и прототипы.

Минусы и потери

Теряет функции, undefined, Symbol

JSON.stringify({ fn: () => {}, u: undefined, s: Symbol() });
// '{}' — все пропадают

Date → строка (не восстанавливается)

JSON.stringify({ d: new Date() });
// '{"d":"2024-..."}' — станет строкой, не Date при парсинге

Map, Set → пустой объект

JSON.stringify(new Map([['a', 1]])); // '{}' — теряет содержимое

BigInt → ошибка

JSON.stringify({ n: 10n }); // TypeError: Do not know how to serialize a BigInt

Циклические ссылки → ошибка

const obj = {}; obj.self = obj;
JSON.stringify(obj); // TypeError: circular structure

NaN, Infinity → null

JSON.stringify({ x: NaN, y: Infinity }); // '{"x":null,"y":null}'

Теряет прототип и не-enumerable свойства

Результат — простой объект без методов класса.

Производительность

Для больших объектов сериализация+парсинг медленнее специализированных решений.

Следствия

Популярный трюк глубокого копирования JSON.parse(JSON.stringify(obj)) непригоден для объектов с функциями, датами, Map/Set, циклами, BigInt.

Альтернативы

  • structuredClone — глубокая копия с Map/Set/Date/циклами (не функции).
  • lodash.cloneDeep — для сложных структур.
  • Кастомный replacer/reviver — для частичного контроля.

Коротко для собеседования

Минусы JSON.stringify: теряет функции, undefined, Symbol; Date → строка; Map/Set → {}; BigInt и циклы → ошибка; NaN/Infinity → null; теряет прототип. Поэтому JSON.parse(JSON.stringify()) для глубокой копии ненадёжен. Альтернативы — structuredClone (Map/Set/циклы, но не функции), lodash.cloneDeep.

Другие вопросы раздела