Задать вопрос

Что такое и зачем нужен новый тип данный Symbol в ES15?

Читаю статью https://learn.javascript.ru/symbol. Вообще ничего не понятно! Так еще и нету других рускоязычных источнкиков по этому поводу.

Если кто-то прошел через эти круги ада, и понял, то можете, пожалуйста, объяснить всю эту кашу? Зачем это надо? Что такое глобальный символ? Какой еще реестр? И самое главное - зачем это?!

Заранее выражаю огромную благодарность всем, кто ответит!

С уважением, Евгений.
  • Вопрос задан
  • 2320 просмотров
Подписаться 5 Простой 2 комментария
Решения вопроса 1
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
Что такое

Новый тип данных symbol - это попытка ввести уникальные идентификаторы. Все крутится вокруг функции Symbol. Это не конструктор в полном смысле слова, с new ее использовать не получится. Это скорее маленькая фабрика. Она просто возвращает новый символ каждый раз. Это важно. Каждый раз новый. В качестве аргумента можно передать строку, но она используется только для отладки.
Symbol() === Symbol() // false

Что такое глобальный символ? Какой еще реестр?

Есть Symbol.for(), это еще один метод, который не просто возвращает символ, но и сохраняет информацию о том, для какого параметра он создавался. Внешне логика работы напоминает хеширование - для разных параметров символы получаются разные, а для одинаковых - одинаковые.
Symbol.for('my-string') === Symbol.for('my-string') // true
Symbol.for('my-string') === Symbol.for('another-string') // false


Зачем это надо?

Применение этого типа данных - предмет для споров. Большая часть кейсов из интернета - это попытки поиспользовать новую фишку только ради того, чтобы ее поиспользовать. Самые популярные и практически применимые варианты:
  • В качестве ключа для доступа к свойству объекта. Грубо говоря вместо obj[key] использовать obj[some-magic-unique-key]. Позволяет избежать коллизии этих самых ключей если вы расширяете существующий объект из сторонней библиотеки. На практике встречается не очень часто, особенно в небольших проектах, но по всей видимости это - причина появления символов в языке.
  • Некоторая иллюзия приватных свойств. Символы по-своему работают с циклами и многими методами, связанными со свойствами объекта, становясь невидимыми для них. В результате можно разделить "все свойства с обычными ключами" и "все свойства с ключами-символами". А еще можно запутать код до безобразия.
  • Также, пользуясь предыдущей мыслью, можно сделать что-то вроде метаданных для любого объекта, которые опять же не сломают существующий код, но могут быть использованы для хранения какой-то информации и мередачи ее между отдельными модулями. Штука довольно интересная.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@undefined_title
это надо для создания уникальных свойств, для избежания конфликта имен. Глобальный символ это тот который у тебя будет доступен с любого места программы, потому что символ объявленный переменной через var будет доступен только в текущей лексической области видимости, если ты объявил имя поля в объекте через символ, то достучаться к значению этого поля ты сможешь только через этот символ.

Symbol - уникальный примитивный тип данных который был добавлен в ES6, каждый созданый символ никогда не будут равен друг другу, только если не сравнивается одна и та же ссылка символа, то есть поведение сравнения как и в объектов, но использовать объекты как уникальные поля мы не сможем, при объявлении имя поля как объект он будет переведет в примитив, потому что именами полей объекта могут быть только примитивы(строки), создать символ как объект через его конструктор не выйдет, для этого можно использовать конструктор Object, символ принимает строку, которая понадобится при дебаге. также символ это единствинный тип у которого нет литерала. символы позволяли бы создавать настоящие приватные свойства если бы не было метода Object.getOwnPropertySymbols который возвращает список всех символов объекта. Символы в основном используются не для создания приватных свойств, а для их уникальности, что бы имена не конфликтовали с именами сторонних разработчиков. Symbol.for('name') возвращает символ из глобального контекста, если такого нет создает и потом возвращает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы