- •Типы данных в es2015. Какие есть типы, какие из них примитивные, в чём разница и каковы особенности? Для каких есть литералы? Оператор typeof.
- •Тип данных Number. Его особенности, свойства, методы.
- •Тип данных String. Его особенности, свойства, методы. Строковые шаблоны.
- •Доступ к символам
- •Изменения строк
- •Смена регистра
- •Поиск подстроки
- •Отрицательные аргументы
- •Кодировка Юникод
- •Тип данных Symbol. Его особенности, свойства, методы.
- •Объявление
- •Глобальные символы
- •Использование символов
- •Приведение типов, неявное и явное. Взаимодействие типов с операторами.
- •Строковое преобразование
- •Численное преобразование
- •Специальные значения
- •Логическое преобразование
- •Встроенные модальные окна.
- •Массивы, их методы, особенности.
- •Методы pop/push, shift/unshift
- •Типизированные массивы. В чём их отличие, зачем они нужны, как с ними работать?
- •Типизированные массивы
- •Условные операторы, операторы циклов, переходы и метки.
- •Оператор вопросительный знак „?“
- •Варианты объявления функций в es2015, чем они отличаются?
- •Параметры по умолчанию
- •Оператор spread вместо arguments
- •Деструктуризация в параметрах
- •Область видимости, понятие замыкания.
- •Специальные значения this и arguments внутри функции.
- •Функции-стрелки не имеют своего this. Внутри функций-стрелок – тот же this, что и снаружи.
- •Методы и свойства функций. Как с ними работать и когда их применять?
- •Что такое каррирование, как оно работает и зачем нужно? Что такое мемоизация?
- •Работа с объектом типа Date.
- •Создание
- •Получение компонентов даты
- •Установка компонентов даты
- •Автоисправление даты
- •Преобразование к числу, разность дат
- •Форматирование и вывод дат
- •Метод Date.Now()
- •Объект как хеш-таблица.
- •Конфигурируемые свойства объекта.
- •Атрибуты свойств
- •Дескрипторы свойств
- •Перечислимые свойства объекта
- •Иммутабельность объектов. Копирование объектов. Что такое иммутабельность?
- •Копирование по ссылке
- •Особенности системы наследования объектов.
- •Наследование свойств
- •Наследование "методов"
- •Объектно-ориентированное программирование, принципы, парадигмы.
- •Псевдо-классовое наследование в es5 и es2015. Как организуется, на чём базируется, что изменилось в es2015.
- •Функциональное наследование.
- •Встроенные коллекции в es2015.
- •Обработка исключений. Принципы работы и когда следует использовать.
- •Таймеры и периодические вызовы.
- •Отмена исполнения clearTimeout
- •Цикл событий, принципы работы асинхронности.
- •Промисы (promise), назначение и особенности работы. Использование async/await.
- •Пример с setTimeout
- •Параллельное выполнение
- •Как мы будем их использовать?
- •Генераторы (generators). В чём заключаются, как работают, когда могут применяться?
- •Создание генератора
- •Генератор – итератор
- •Yield – дорога в обе стороны
- •Асинхронный код
- •Синтаксис диалекта регулярных выражений, доступный в es2015. Метасимволы, группировки, обратные ссылки, квантификаторы, символьный класс и выбор, позиционные проверки.
- •Использование регулярных выражений в конструкциях языка. Методы и свойства объекта регулярных выражений, методы строк, результаты операций.
Тип данных Symbol. Его особенности, свойства, методы.
Тип данных Symbol служит для создания уникальных идентификаторов.
Объявление
let sym = Symbol();
Не new Symbol, а просто Symbol, так как это – примитив. Каждый символ – уникален. У функции Symbol есть необязательный аргумент «имя символа». Его можно использовать для описания символа, в целях отладки, но при этом, если у двух символов одинаковое имя, то это не значит, что они равны.
Глобальные символы
Существует «глобальный реестр» символов, который позволяет, при необходимости, иметь общие «глобальные» символы, которые можно получить из реестра по имени. Для чтения (или создания, при отсутствии) «глобального» символа служит вызов Symbol.for(имя).
// создание символа в реестре
let name = Symbol.for("name");
Таким образом, можно из разных частей программы, обратившись к реестру, получить единый глобальный символ с именем "name".
У вызова Symbol.for, который возвращает символ по имени, есть обратный вызов – Symbol.keyFor(sym). Он позволяет получить по глобальному символу его имя:
// получение имени символа
Symbol.keyFor(name); // name
Symbol.keyFor возвращает undefined, если символ не глобальный.
Использование символов
Самое широкое применение символов предусмотрено внутри самого стандарта JavaScript. В современном стандарте есть много системных символов. Их список есть в спецификации, в таблице Well-known Symbols. В спецификации для краткости символы принято обозначать как „@@имя“, например @@iterator, но доступны они как свойства Symbol.
Например:
Symbol.toPrimitive – идентификатор для свойства, задающего функцию преобразования объекта в примитив.
Symbol.iterator – идентификатор для свойства, задающего функцию итерации по объекту.
Допустим, в новом стандарте нам надо добавить к объекту «особый» функционал, например, функцию, которая задаёт преобразование объекта к примитиву. Мы ведь не можем просто сказать, что «свойство obj.toPrimitive теперь будет задавать преобразование к примитиву и автоматически вызываться в таких-то ситуациях». Это опасно. Мы не можем так просто взять и придать особый смысл свойству. Мало ли, вполне возможно, что свойство с таким именем уже используется в существующем коде, и если сделать его особым, то он сломается. Нельзя просто взять и зарезервировать какие-то свойства существующих объектов для нового функционала. Поэтому ввели целый тип «символы». Их можно использовать для задания таких свойств, так как они: уникальны; не участвуют в циклах; заведомо не сломают старый код, который о них слыхом не слыхивал. Чтобы получить все символы объекта, есть особый вызов Object.getOwnPropertySymbols. Эта функция возвращает все символы в объекте (и только их).
Приведение типов, неявное и явное. Взаимодействие типов с операторами.
В JavaScript есть три преобразования:
Строковое преобразование.
Числовое преобразование.
Преобразование к логическому значению.
Строковое преобразование
Строковое преобразование происходит, когда требуется представление чего-либо в виде строки. Например, в неявном виде его производит функция alert.
При приведении объекта к строке неявным образом вызывается метод toString, который так же можно вызвать явно.
Можно также осуществить преобразование явным вызовом String(val):
String(null) === "null"; // true
Также для явного преобразования применяется оператор "+", у которого один из аргументов строка. При «сложении» числа со строкой, число преобразуется к строке и происходит его конкатенация (склеивание) со вторым операндом. Например:
123 + "test"; // "123test"
"123" + undefined; // "123undefined"
