Символ

В JavaScript, Символ це  primitive value.

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

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

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

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

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

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

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

Більшість значень у 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 має константи для так званих "відомих" символів. Ці символи дозволяються вам настроювати взаємодію з об'єктом, за допомогою використання цих властивостей як ключів. Прикладами таких ключів є: Symbol.iterator для об'єктів-масивів, або Symbol.search для стрінгових об'єктів.

Вони перелічені в таблиці відомих символів (Well-known symbols):

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

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

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

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

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

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