Кратко
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 — как гардероб с регистрацией: один номер — одна полка.
Примеры
**Самый простой:**
const sym = Symbol('mySymbol');
console.log(typeof sym); // 'symbol'
console.log(sym.toString()); // 'Symbol(mySymbol)'
// Каждый Symbol уникален
console.log(Symbol() === Symbol()); // falseSymbol — уникальный примитив с описанием.
**Простой:**
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 как ключ объекта — уникальные идентификаторы.
**Реальный пример:**
// Symbol.for для кросс-модульной связи
const EVENTS = Symbol.for('app:events');
// Модуль 1
const emitter = {
[EVENTS]: []
};
// Модуль 2 (другой файл)
const globalSymbol = Symbol.for('app:events');
emitter[globalSymbol].push('userLogin');
// Оба модуля используют один и тот же SymbolSymbol.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 — коллекции со слабыми ссылками.