Какие минусы у 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 structureNaN, 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.