ES6
Last updated
Was this helpful?
Last updated
Was this helpful?
Это новый примитивный тип данных, как boolean
или string
, который нужен для создания уникальных идентификаторов. Для простоты понимания представьте себе функцию которая возвращает всегда уникальный id, только в нашем случае вместо id – символ.
Это уникальный и неизменяемый тип данных, может быть использован как идентификатор для свойств объектов, к которому нельзя получить доступ.
Важно!
Все другие примитивы могут стать объектами, если объявить их через new
, а symbol
не может. Почему так? Простыми словами — от символа мы хотим получить уникальный идентификатор, то есть сам Символ, а new
возвращает объект, объект нам не нужен.
Существуют «глобальные символы», они доступны во всех частях вашей программы. То есть вы можете создать символ и поместить его в некую базу, это делается с помощью функции Symbol.for()
Если мы ещё раз вызовем Symbol.for(“Kanye West”)
он вернёт существующий символ, а не новый. Для глобальных символов, кроме Symbol.for(key)
, который ищет символ по имени, существует обратный метод: Symbol.keyFor(sym)
, который, наоборот, принимает глобальный символ и возвращает его имя.
К примеру:
Замечание:Symbol.length
Содержит длину, всегда равную 0 (нулю).
Метод Object.getOwnPropertySymbols()
возвращает массив символов и позволяет получить символьные свойства конкретного объекта.
Представим, у вас есть некий объект в приложении, который используется много где, да и с ним работаете не только вы, он передаётся по разным функциям, над ним издеваются с помощью разных методов, и вдруг вам понадобилось запихнуть в этот объект свои данные, например логи.
Что вы будете делать — создадите новое поле объекта и присвоите ему свои логи. Но тут есть нюанс, если объект используется в большом количестве логики и другие разработчики как-то взаимодействуют с параметрами объекта, то есть шанс, что ваше новое поле где-то сможет сломать цикл, а где-то перезапишет собой другие поля.
Для решение этой проблемы, можно использовать symbol
Как видно, поле, ключом которого является symbol
, нельзя обнаружить с помощью методов и конструкций вроде for..in
. Поэтому новое свойство объекта не сломает приложение там, где используется логика похожая на ту, что выше.
Примеры итерируемого объекта: массив, строка, коллекция DOM-элементов.
Итерируемый объект имеет метод [Symbol,iterator](), который возвращает объект Iterator. Iterator содержит метод next(), который возвращает объект, имеющий свойства done, value.
Когда хочешь перебирать объекты и другие типы данных по своему, итератор это отличный вариант.
Функция, которая останавливает свое выполнение, возвращает промежуточный результат и далее возобновляет свое выполнение.
yield - давать(производить) информацию; уступать или отдавать контроль или ответственность.
Генераторы - позволяют определить алгоритм перебора, написав функцию, которая умеет сама поддерживать собственное состояние (отличие от итераторов).
Генераторы = что мы хотим; Итераторы = как мы хотим это реализовать.
В целом, его используют разные библиотеки как замену async/await
для работы с асинхронными операциями. Сам async/await
кстати, это high level абстракция над генераторами. Также популярная redux-saga использует генераторы. В остальных случаях их применяют очень редко.
Yield как бы говорит — передаём name и ставим паузу, пока не произойдёт следующий вызов next().
То есть по сути возвращается объект, свойство value которого содержит собственно сгенерированное значение. А свойство done указывает, достигли ли мы конца генератора.