Какое преимущество использования Symbol.for ('string') вместо простой строки

Когда я использую такой код:

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(), если вам нужны уникальные символы.

Barmar 24.07.2018 01:41
stackoverflow.com/questions/30984858/…
Bergi 24.07.2018 14:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
273
1

Ответы 1

Вы не используете Symbol.for(), если пытаетесь избежать конфликтов с другим кодом, который использует глобальный символ с тем же именем.

Так зачем использовать зарегистрированный символ вместо строки? У символов есть другие особенности, которых нет у строк.

  • Object.keys() и Object.values() не будут возвращать никаких свойств, названных с помощью символов, вы должны использовать Object.getOwnPropertySymbols().
  • Они не будут конфликтовать со строковыми ключами; если вы используете символы для свойств в элементах DOM, вам не нужно беспокоиться о том, что они конфликтуют со свойствами, добавленными в будущей версии DOM.
  • Они не приводят автоматически к примитивным типам, поэтому хороши для обнаружения ошибок.

Есть дополнительная информация о том, для каких символов подходят Метапрограммирование в ES6: символы и почему они классные.

Их также нельзя перечислить, это еще одно большое преимущество. Я должен уточнить это заявление. Их нельзя перечислить через for...in, хотя в их дескрипторе свойств указано, что они перечислимы.

Patrick Roberts 24.07.2018 02:43

Согласно странице, на которую я ссылался, вы должны сделать их не перечисляемыми с помощью Object.defineProperty().

Barmar 24.07.2018 02:45

Другие вопросы по теме