Коротка відповідь
juniorSymbol — це примітивний тип, що створює унікальний ідентифікатор для властивостей об’єктів. У практиці він використовується як ключі в Map, для створення приватних полів і уникнення конфліктів у бібліотеках. Перетворити десяткове число в 16‑розрядну (або 2/8) можна через `Number.prototype.toString(base)`; наприклад, `(255).toString(16)` → `ff`.
Повне пояснення
Що це і навіщо
- Symbol – примітивний тип, створений у ES6. Кожен Symbol є унікальним і незмінним значенням, що використовується як ключі об’єктів.
- Практичне застосування:
- приватні поля в класах (
#field), - унікальні ключі для властивостей, що не повинні конфліктувати з іншими бібліотеками,
- ключі в
Map/WeakMap, - метадані (наприклад,
Symbol.iterator).
- приватні поля в класах (
Як це працює
- Створення:
const sym = Symbol('опис');– опис необов’язковий. - Унікальність:
Symbol('a') !== Symbol('a'). - Доступ до властивостей:
obj[sym] = value; const v = obj[sym];.
Практика і реалізація
const id = Symbol('id');
class User {
constructor(name) { this.name = name; }
[id]() { return `User: ${this.name}`; }
}
const u = new User('Alice');
console.log(u[id]()); // "User: Alice"
Перетворення чисел
Number.prototype.toString(radix)повертає рядок у заданій системі числення (2–36).- Приклад:
(255).toString(16)→'ff'(hex),(10).toString(2)→'1010'(binary),(8).toString(8)→'10'(octal). - Для великих чисел можна використовувати
BigInt:(12345678901234567890n).toString(16).
Тестування
- У Jest:
expect((255).toString(16)).toBe('ff');.
Оптимізація
- Для частих перетворень можна кешувати результати.
Часті помилки
- Забудьте, що
toString(2)повертає рядок, а не число. - Не використовуйте
parseIntбез вказання бази:parseInt('ff')→ 0. - Для великих чисел використовуйте
BigInt, інакше отримаєте помилку. - Symbol не можна перетворити в рядок без
String(sym)– це поверне опис. - Не можна використовувати Symbol як ключ у JSON без спеціальної обробки.
Symbol.for('key')створює глобальний Symbol, що може призвести до колізій.Object.keys(obj)не повертає Symbol‑ключі; використовуйтеReflect.ownKeys.- Не можна порівнювати Symbol з рядком без явного перетворення.
Cheatsheet
Symbol()– новий Symbol.Symbol.for(key)– глобальний Symbol.obj[Symbol.iterator]()– ітератор.Object.getOwnPropertySymbols(obj)– масив Symbol‑ключів.
Follow-up питання
- Як отримати список усіх Symbol‑ключів об’єкта?
- Чому
Symbolне підлягає серіалізації в JSON і як це обійти? - Які переваги має використання Symbol замість рядкових ключів у бібліотеках?