Что такое Symbol?
Тип данных Symbol в JavaScript представляет собой уникальный и неизменяемый примитивный тип данных, который был введен в стандарт ES6 для решения задачи создания скрытых и уникальных идентификаторов свойств объектов.
Главная особенность символов заключается в том, что даже если два символа созданы с абсолютно одинаковым описанием или вообще без него, они все равно строго не равны между собой. Например, вызов Symbol('desc') всегда будет возвращать уникальное значение, и условие Symbol('desc') !== Symbol('desc') всегда вернет истину.
На практике символы чаще всего используются для создания уникальных ключей свойств объектов, которые не будут конфликтовать с другими свойствами. Это особенно полезно при разработке библиотек или добавлении метаданных, скрытых от стандартных циклов перебора вроде for...in.
Для ситуаций, когда необходимо использовать один и тот же символ в разных частях приложения, существует глобальный реестр символов. Доступ к нему осуществляется через специальные методы работы с глобальным пространством имен:
Кроме того, в JavaScript существует набор так называемых хорошо известных символов (well-known symbols), которые встроены в язык и позволяют разработчикам изменять поведение встроенных механизмов объектов.
Ярким примером такого символа является Symbol.iterator, который определяет итератор по умолчанию для объекта. Реализовав этот метод, разработчик получает возможность использовать свой собственный объект в цикле for...of.