Когда я использую такой код:
const sym = Symbol('toAvoidInterference');
document.querySelector('#someid')[sym] = 'Hello, world!';
имеет смысл избегать вмешательства в имена других атрибутов. Но какая разница и польза от использования:
const sym = Symbol.for('attributeName');
document.querySelector('#someid')[sym] = 'Hello, world!';
если это то же самое, что мы можем написать вместо этого:
document.querySelector('#someid')['attributeName'] = 'Hello, world!';
В обоих случаях другой разработчик может использовать атрибут с тем же именем, несмотря на то, что он заключен в метод forSymbol или нет, потому что мы не можем быть уверены, что эта строка уникальна. Почему нужно использовать Symbol.for () вместо простой строки?
UPD.
Я неожиданно изобрел самую полезную функцию вызова Symbol.for(). Если в вашем коде используются символы, иногда трудно использовать условные точки останова во время отладки. Например, вам нужно поймать, равна ли переменная значению, имеющему тип символа, и это значение привязано в другом модуле. Первый сложный способ - использовать это значение как константу и экспортировать его из этого модуля. В этом случае состояние точки останова будет выглядеть так:
catchedVariable === exportedSymbolConst
Но самый простой способ - временно изменить код внутри модуля, добавив .for в Symbol. Затем вы можете написать условие:
catchedVariable === Symbol.for('string_key')
После успешной отладки вы измените код обратно, просто удалив часть .for.
Точный дубликат Для чего нужны символы реестра (Symbol.for) в Javascript ES6?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не используете Symbol.for(), если пытаетесь избежать конфликтов с другим кодом, который использует глобальный символ с тем же именем.
Так зачем использовать зарегистрированный символ вместо строки? У символов есть другие особенности, которых нет у строк.
Object.keys() и Object.values() не будут возвращать никаких свойств, названных с помощью символов, вы должны использовать Object.getOwnPropertySymbols().Есть дополнительная информация о том, для каких символов подходят Метапрограммирование в ES6: символы и почему они классные.
Их также нельзя перечислить, это еще одно большое преимущество. Я должен уточнить это заявление. Их нельзя перечислить через for...in, хотя в их дескрипторе свойств указано, что они перечислимы.
Согласно странице, на которую я ссылался, вы должны сделать их не перечисляемыми с помощью Object.defineProperty().
Вы не используете
Symbol.for(), если вам нужны уникальные символы.