Что такое и зачем нужен новый тип данный Symbol в ES15?
Что такое
Новый тип данных 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]. Позволяет избежать коллизии этих самых ключей если вы расширяете существующий объект из сторонней библиотеки. На практике встречается не очень часто, особенно в небольших проектах, но по всей видимости это - причина появления символов в языке.Некоторая иллюзия приватных свойств. Символы по-своему работают с циклами и многими методами, связанными со свойствами объекта, становясь невидимыми для них. В результате можно разделить "все свойства с обычными ключами" и "все свойства с ключами-символами". А еще можно запутать код до безобразия.Также, пользуясь предыдущей мыслью, можно сделать что-то вроде метаданных для любого объекта, которые опять же не сломают существующий код, но могут быть использованы для хранения какой-то информации и мередачи ее между отдельными модулями. Штука довольно интересная.
это надо для создания уникальных свойств, для избежания конфликта имен. Глобальный символ это тот который у тебя будет доступен с любого места программы, потому что символ объявленный переменной через var будет доступен только в текущей лексической области видимости, если ты объявил имя поля в объекте через символ, то достучаться к значению этого поля ты сможешь только через этот символ.
Symbol - уникальный примитивный тип данных который был добавлен в ES6, каждый созданый символ никогда не будут равен друг другу, только если не сравнивается одна и та же ссылка символа, то есть поведение сравнения как и в объектов, но использовать объекты как уникальные поля мы не сможем, при объявлении имя поля как объект он будет переведет в примитив, потому что именами полей объекта могут быть только примитивы(строки), создать символ как объект через его конструктор не выйдет, для этого можно использовать конструктор Object, символ принимает строку, которая понадобится при дебаге. также символ это единствинный тип у которого нет литерала. символы позволяли бы создавать настоящие приватные свойства если бы не было метода Object.getOwnPropertySymbols который возвращает список всех символов объекта. Символы в основном используются не для создания приватных свойств, а для их уникальности, что бы имена не конфликтовали с именами сторонних разработчиков. Symbol.for('name') возвращает символ из глобального контекста, если такого нет создает и потом возвращает