JS Advanced

Symbol

Понять, что Symbol — это уникальный примитив, как использовать well-known Symbols, и где они встречаются в реальном коде.

Продвинутый (Advanced)

Кратко

Symbol — примитивный тип, создающий уникальные идентификаторы. Каждый Symbol уникален: Symbol() !== Symbol(). Symbol.for('key') создаёт глобальные символы. Well-known Symbols (Symbol.iterator, Symbol.toPrimitive) определяют поведение объектов.


Подробно

Создание: const sym1 = Symbol(); const sym2 = Symbol('description'); console.log(sym1 === sym2); // false — каждый уникален

Symbol.for() — глобальные символы: const s1 = Symbol.for('myKey'); const s2 = Symbol.for('myKey'); console.log(s1 === s2); // true — один и тот же символ

Symbol.keyFor() — обратный поиск: Symbol.keyFor(s1); // 'myKey'

Использование как ключ объекта: const ID = Symbol('id'); const user = { name: 'Анна', [ID]: 123 }; console.log(user[ID]); // 123

Well-known Symbols:

  • Symbol.iterator — определяет поведение for...of
  • Symbol.toPrimitive — определяет преобразование в примитив
  • Symbol.hasInstance — определяет instanceof
  • Symbol.toStringTag — определяет результат Object.prototype.toString()

Symbol как приватный ключ: const _private = Symbol('private'); class MyClass { constructor() { this[_private] = 'секрет'; } } // Нет стандартного способа получить доступ к _private снаружи


Ментальная модель

Symbol — как номерной жетон в гардеробе. Каждый жетон уникален (Symbol()). Вы можете повесить пальто на крючок с жетоном ([symbol]). Symbol.for — как гардероб с регистрацией: один номер — одна полка.


Примеры

**Самый простой:**

javascript
const sym = Symbol('mySymbol');
console.log(typeof sym); // 'symbol'
console.log(sym.toString()); // 'Symbol(mySymbol)'

// Каждый Symbol уникален
console.log(Symbol() === Symbol()); // false

Symbol — уникальный примитив с описанием.

**Простой:**

javascript
const ID = Symbol('id');
const NAME = Symbol('name');

const user = {
  [ID]: 1,
  [NAME]: 'Анна',
  toString() {
    return this[NAME];
  }
};

console.log(user[ID]); // 1
console.log(user[NAME]); // 'Анна'
console.log(`${user}`); // 'Анна'

Symbol как ключ объекта — уникальные идентификаторы.

**Реальный пример:**

javascript
// Symbol.for для кросс-модульной связи
const EVENTS = Symbol.for('app:events');

// Модуль 1
const emitter = {
  [EVENTS]: []
};

// Модуль 2 (другой файл)
const globalSymbol = Symbol.for('app:events');
emitter[globalSymbol].push('userLogin');

// Оба модуля используют один и тот же Symbol

Symbol.for для связи между модулями без прямых импортов.


Частые ошибки

**Неправильно:** Думать, что Symbol нужен в каждом проекте

**Почему:** Symbol — нишевый тип. Большинство проектов обходятся без него.

**Правильно:** Symbol полезен для: приватных ключей, метаданных, well-known symbols.

**Неправильно:** Путать Symbol() и Symbol.for()

**Почему:** Symbol() создаёт уникальный символ. Symbol.for() — глобальный с общим ключом.

**Правильно:** Symbol() — всегда уникален. Symbol.for('key') — один на все модули.


Важно запомнить

  • Symbol — уникальный примитив
  • Symbol.for() — глобальные символы
  • Well-known Symbols определяют поведение объектов
  • Symbol как ключ — приватные свойства
  • Symbol редко нужен в обычном коде

Связь

Назад: Вы знаете типы (J3) и объекты (J11). Symbol — седьмой примитивный тип.

Вперёд: Следующий урок (JV5) — WeakMap и WeakSet — коллекции со слабыми ссылками.

Материалы курса JS Advanced — PROlab Academy.