Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить метод toJSON()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)`toJSON()` - це **спеціальний метод**, який JavaScript викликає **автоматично** під час серіалізації об'єкта через `JSON.stringify()`. **Ключове:** якщо у об'єкта є метод `toJSON()`, то при виклику `JSON.stringify(obj)` замість самого об'єкта серіалізується результат виклику цього методу.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення`toJSON()` - це **спеціальний метод**, який JavaScript викликає **автоматично** під час серіалізації об'єкта через `JSON.stringify()`. Він дозволяє **контролювати**, **що саме потрапить** у JSON-рядок. ## Коротко Якщо у об'єкта є метод `toJSON()`, то при виклику `JSON.stringify(obj)` замість самого об'єкта серіалізується **результат виклику цього методу**. ## Приклад - базовий ```javascript const user = { name: 'Alex', age: 25, password: 'secret', toJSON() { // обираємо, що потрапить у JSON return { name: this.name, age: this.age }; } }; console.log(JSON.stringify(user)); // '{"name":"Alex","age":25}' ``` `password` не потрапив у JSON, тому що `toJSON()` повертає лише `name` та `age`. ## Як це працює "під капотом" Коли ти викликаєш: ```javascript JSON.stringify(obj) ``` JavaScript робить наступне: 1. Перевіряє: чи є у `obj` метод `toJSON()`? → якщо **є** - викликає його: ```javascript const value = obj.toJSON(); ``` 2. Серіалізує **результат** виклику, а не сам об'єкт. ## Приклад із вкладеними об'єктами `toJSON()` працює рекурсивно для всіх вкладених об'єктів. ```javascript const user = { name: 'Alex', stats: { score: 42, toJSON() { return 'Top Secret'; // замінюємо об'єкт рядком } } }; console.log(JSON.stringify(user)); // '{"name":"Alex","stats":"Top Secret"}' ``` Метод `toJSON()` всередині `stats` був викликаний автоматично і підмінив вкладений об'єкт. ## Приклад із класами Можна використовувати `toJSON()` у своїх класах, щоб гарно серіалізувати екземпляри: ```javascript class User { constructor(name, age) { this.name = name; this.age = age; } toJSON() { return { user: this.name, age: this.age }; } } const alex = new User('Alex', 25); console.log(JSON.stringify(alex)); // '{"user":"Alex","age":25}' ``` Це зручно, щоб визначати "чисте" представлення даних, наприклад, при відправці на сервер. ## Приклад: вбудовані типи теж мають toJSON() | Тип | Що робить `toJSON()` | Приклад | |---|---|---| | `Date` | Повертає ISO-рядок | `new Date().toJSON()` → `"2025-10-14T17:00:00.000Z"` | | `Map` / `Set` | Не серіалізуються (типово) | `JSON.stringify(new Map())` → `{}` | | `BigInt` | Не підтримується | Помилка: *TypeError: Do not know how to serialize a BigInt* | ## Приклад, якщо toJSON() повертає не об'єкт Можна повернути **будь-яке значення** - рядок, число, навіть `null`. ```javascript const product = { name: 'T-shirt', price: 1500, toJSON() { return `${this.name}: ${this.price}$`; } }; console.log(JSON.stringify(product)); // "\"T-shirt: 1500$\"" ``` Повернутий рядок стає результатом серіалізації. ## Взаємодія з replacer Якщо у об'єкта є і `toJSON()`, і `replacer`, то спочатку викликається `toJSON()`, а потім результат передається у `replacer`. ```javascript const obj = { name: 'Alex', toJSON() { return { custom: true }; } }; console.log(JSON.stringify(obj, (key, value) => { if (key === 'custom') return 'done'; return value; })); // '{"custom":"done"}' ``` ## ІТОГ | Що робить | Визначає, **що буде серіалізовано** у `JSON.stringify()` | |---|---| | Де викликається | Автоматично при `JSON.stringify()` | | Що повертає | Будь-яке значення (об'єкт, рядок, число тощо) | | Працює рекурсивно | Так (для вкладених об'єктів) | | Можна використовувати у класах | Так | | Ігнорується при `JSON.parse()` | Так (працює лише на серіалізацію) |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.