Вебсправочник
Справочник JavaScript

Symbol: уникальный ключ свойства объекта

Symbol создаёт примитивное значение, которое можно использовать как уникальный ключ свойства. Совпадающие описания символов не делают их одинаковыми ключами.

Назначение

Symbol создаёт примитивное значение, которое можно использовать как уникальный ключ свойства. Совпадающие описания символов не делают их одинаковыми ключами.

Как это работает

Описание служит для диагностики. Обычный Object.keys не включает символьные ключи, а Reflect.ownKeys возвращает собственные строковые и символьные ключи. Это различие относится к способу перечисления, а не к защите данных.

Пример

const marker = Symbol("lesson");
const another = Symbol("lesson");
const record = {title:"HTML", [marker]:true};
console.assert(marker !== another);
console.assert(record[marker] === true);
console.assert(record[another] === undefined);
console.assert(Object.keys(record).length === 1);
console.assert(Reflect.ownKeys(record).includes(marker));
console.log(record.title);

Что должно получиться

Свойство доступно по исходному символу, но не по новому символу с тем же описанием. Обычный список строковых ключей показывает только title.

Граница применения и частая ошибка

Символьный ключ не является секретом: его можно обнаружить средствами языка. JSON.stringify обычно пропускает такие свойства, поэтому они не подходят для данных, которые должны сохраняться в JSON. Symbol.for использует отдельный реестр и отличается от нового Symbol.

Самостоятельная проверка

Добавьте второй символьный ключ и сравните Object.getOwnPropertySymbols с Reflect.ownKeys. Сериализуйте объект в JSON и объясните потерю служебной отметки. Решите, нужен ли вам уникальный ключ или обычное сохраняемое поле.

Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.