Для чего нужен тип 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, не приводится к строке неявно, но и не гарантирует приватность.