Символ

У JavaScript, символ (Symbol) є простим типом даних.

Значення типу символ також називають "Символьним значенням". У середовищі виконання JavaScript символьне значення створюється викликом функції Symbol, яка динамічно створює анонімне, унікальне значення. Символ можна використовувати як властивість об'єкта.

Символ може мати необов'язковий опис, але тільки для відлагодження.

Символьне значення є унікальним ідентифікатором. Наприклад,

// Ось два символи з однаковим описом,
let Sym1 = Symbol("Sym");
let Sym2 = Symbol("Sym");

console.log(Sym1 == Sym2); // повертає "false"
// Символи гарантовано є унікальними.
// Навіть якщо ми створимо багато символів з тим самим описом,
// вони будуть різними значеннями.

Заувага: Якщо ви знайомі з Ruby чи іншою мовою, що має свій аналог “символів” – будь ласка, не плутайте. Символи JavaScript інші.

Символьний тип - це новий функціонал у ECMAScript 2015, і він не має еквіваленту у ECMAScript 5. У деяких мовах програмування символьний тип даних також називається "атом".

Символи не мають автоматичного перетворення у "рядки"

Більшість значень у JavaScript підтримують неявне перетворення у рядки. Наприклад, ми можемо викликати alert майже з будь-яким значенням, і це спрацює. Символи особливі. Вони не перетворюються автоматично.

Наприклад,

let Sym = Symbol("Sym");

alert(Sym); // TypeError: Cannot convert a Symbol value to a string

Це “мовний захист” від плутанини, тому що рядки та символи є фундаментально різними, і не повинні випадково перетворюватись один на одного.

Якщо нам дуже потрібно вивести символ, треба викликати на ньому метод .toString(), наприклад,

let Sym = Symbol("Sym");

alert(Sym.toString()); // Symbol(Sym), тепер це працює

Або ми можемо скористатись властивістю символу symbol.description, щоб дістати його опис, наприклад,

let _Sym = Symbol("Sym");

alert(_Sym.description); // Sym

Добревідомі символи

Клас Symbol має константи для так званих добревідомих символів. Ці символи дозволяють налаштовувати взаємодію JS з об'єктом, використовуючи їх в якості ключів. Прикладами добревідомих символів є: Symbol.iterator для подібних до масивів об'єктів, або Symbol.search для рядкових об'єктів.

Вони наведені у таблиці специфікації Добревідомі символи:

  • Symbol.hasInstance
  • Symbol.isConcatSpreadable
  • Symbol.iterator
  • Symbol.toPrimitive
  • …і так далі.

Глобальний реєстр символів

Методами, що мають доступ до глобального реєстру символів, є Symbol.for() і Symbol.keyFor(); це посередники між глобальною таблицею (або "реєстром") символів та середовищем виконання. Реєстр символів переважно збудований інфраструктурою компілятора Javascript, а вміст реєстру символів не доступний для інфраструктури виконання Javascript, окрім як за допомогою цих методів. Метод Symbol.for(tokenString) повертає символьне значенняз реєстру, а Symbol.keyFor(symbolValue) повертає рядковий токен з реєстру; ці функції зворотні одна одній, тому наступне є істиною:

Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true

Дізнайтеся більше

Загальні знання