Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить тип symbol?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Symbol** - примітивний тип, що представляє унікальне і незмінне значення; часто використовується як ідентифікатор (ключ) властивості об'єкта. **Ключове:** кожен виклик `Symbol()` створює нове унікальне значення, навіть з однаковим описом.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення### Що робить тип `symbol` у TypeScript Тип `symbol` представляє **унікальне і незмінне значення**, яке часто використовується як **ідентифікатор (ключ)** для властивостей об'єктів. Він був доданий у **ES2015 (ES6)** і підтримується TypeScript з самого початку. --- ### Суть `symbol` Щоразу, коли ти створюєш `Symbol()`, він генерує **унікальне значення**, навіть якщо передати однаковий опис (опис - просто мітка для налагодження). ```javascript const id1 = Symbol("user"); const id2 = Symbol("user"); console.log(id1 === id2); // false - символи унікальні! ``` Тобто навіть при однаковій назві `"user"` - це **різні символи**. --- ### Як оголосити змінну типу `symbol` #### 1. Неявно (TS сам виведе тип): ```javascript const token = Symbol("auth"); // тип: symbol ``` #### 2. Явно вказавши тип: ```javascript let key: symbol = Symbol("key"); ``` --- ### Символи як ключі об'єктів `symbol` часто використовується, щоб додати **унікальну властивість** до об'єкта, яку не буде випадково перезаписано або показано під час ітерації. ```javascript const ID = Symbol("id"); const user = { name: "Tim", [ID]: 12345, }; console.log(user.name); // "Tim" console.log(user[ID]); // 12345 ``` > Властивості з ключем-символом **не видно** під час перебору через `for...in` або `Object.keys()`: > > ```javascript > console.log(Object.keys(user)); // ["name"] > ``` --- ### Навіщо потрібен `symbol` 1. **Для захисту даних** - унікальні властивості, які не можна випадково затерти. 2. **Для створення "прихованих" ключів** у бібліотеках, щоб не перетинатися з чужими властивостями. 3. **Для опису унікальних констант**, особливо в enum-подібних структурах. 4. **Для метапрограмування** - використовуються у спеціальних "well-known symbols". --- ### "Well-known symbols" JavaScript має набір вбудованих символів, які дозволяють змінювати стандартну поведінку об'єктів: | Символ | Призначення | |---|---| | `Symbol.iterator` | Визначає ітерацію об'єкта (`for...of`) | | `Symbol.toStringTag` | Визначає, що повертає `Object.prototype.toString()` | | `Symbol.hasInstance` | Визначає поведінку `instanceof` | | `Symbol.toPrimitive` | Контролює перетворення об'єкта на примітив | | `Symbol.asyncIterator` | Для асинхронних ітераторів | | `Symbol.match`, `Symbol.replace`, `Symbol.search`, `Symbol.split` | Дозволяють кастомізувати роботу з рядками та RegExp | Приклад: ```javascript const person = { [Symbol.toPrimitive](hint) { if (hint === "number") return 42; return "Tim"; } }; console.log(+person); // 42 console.log(`${person}`); // "Tim" ``` --- ### Особливості та обмеження 1. Символи не можна автоматично привести до рядка: ```javascript const s = Symbol("id"); console.log("ID: " + s); // TypeError console.log(s.toString()); // "Symbol(id)" ``` 2. Символи - **унікальні**, але можна отримати **спільні (глобальні)** через `Symbol.for()`: ```javascript const a = Symbol.for("shared"); const b = Symbol.for("shared"); console.log(a === b); // true - один і той самий глобальний символ ``` --- ### Підсумок | Властивість | Опис | |---|---| | Тип | Примітив | | Створюється через | `Symbol()` або `Symbol.for()` | | Унікальність | Завжди унікальний (крім глобальних через `Symbol.for`) | | Основне застосування | Унікальні ключі об'єктів, безпечні ідентифікатори | | Приведення до рядка | Тільки вручну через `.toString()` | | Доступ до значення | Тільки через `[symbol]`, не через крапку |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.