PassFront
  1. PassFront
  2. База знаний
  3. Современный JS ES6+

Для чего нужен тип Symbol в JavaScript и чем он отличается от строки?

Современный JS ES6+

Symbol — примитив, значение которого всегда уникально. Его используют для ключей свойств, которые не должны конфликтовать с другими, и для встроенных протоколов языка.

const a = Symbol('id');
const b = Symbol('id');
a === b; // false — описание только для отладки

Отличия от строки

  • Каждый Symbol() уникален, даже с одинаковым описанием.
  • Свойства-символы не попадают в for...in, Object.keys и JSON.stringify.
  • Они не конвертируются неявно в строку: '' + sym бросит TypeError, нужен sym.toString() или sym.description.

Применение

  • Скрытые/служебные ключи в объектах без риска перезаписать чужие поля:
const meta = Symbol('meta');
const user = { name: 'Ann', [meta]: { cached: true } };
Object.keys(user); // ['name']
  • Well-known symbols — настройка поведения: Symbol.iterator (итерация for...of), Symbol.asyncIterator, Symbol.toPrimitive, Symbol.hasInstance.
  • Константы-перечисления с гарантированной уникальностью.
  • Глобальный реестр: Symbol.for('key') возвращает один и тот же символ для одного ключа.

Нюансы

  • Символы не полностью приватны: Object.getOwnPropertySymbols(obj) и Reflect.ownKeys их покажут.
  • Для настоящей приватности используют #field.

Коротко для собеседования

Symbol — уникальный примитив для неконфликтующих ключей и встроенных протоколов (Symbol.iterator). Не попадает в for...in и JSON.stringify, не приводится к строке неявно, но и не гарантирует приватность.

Другие вопросы раздела