Оглавление....6
Intro....20
Об авторе....20
О техническом редакторе....21
О техническом корректоре....21
Благодарности....22
Введение....23
О чем эта книга?....23
Кому стоит читать эту книгу....25
Как пользоваться этой книгой....25
1. Новые возможности в ES2015-ES2020 и далее....27
Определения, что есть что и терминология....28
Что такое Ecma? ECMAScript? TC39?....28
Что такое ES6? ES7? ES2015? ES2020?....28
«Движки» JavaScript, браузеры и др....29
Что за «новые возможности»?....30
Как создаются новые возможности?....32
Кто здесь главный....32
Процесс....33
Вовлечение в процесс....35
Следите за новыми возможностями....36
Использование текущих функций во вчерашних условиях и разрабатываемых возможностей сегодня....37
Транспилирование примера с помощью Babel....38
Обзор главы....42
2. Объявления блочной области видимости для let и const....44
Введение в let и const....45
Истинная блочная область видимости....45
Повторные объявления — это ошибка....46
Поднятие и временная мертвая зона....47
Новый вид глобальных переменных....50
Const: Константы в JavaScript....52
Основы const....52
Объекты, на которые ссылается const, по-прежнему изменяемы....53
Блочная область видимости в циклах....54
Проблема «замыканий в циклах»....55
Привязки: Как работают переменные, константы и другие идентификаторы....56
Циклы while и do-while....61
Последствия для производительности....62
Константа в блоках цикла....63
Константа в циклах for-in....64
От старых привычек к новым....65
Используйте const или let вместо var....65
Сохраняйте узкую область видимости переменных....65
Используйте блочную область видимости вместо встроенных анонимных функций....65
3. Функции....67
Стрелочные функции и лексические this, super и т. д....68
Синтаксис стрелочной функции....68
Стрелочные функции и лексические this....73
Стрелочные функции не могут быть конструкторами....73
Значения параметров по умолчанию....74
Значения по умолчанию — это выражения....76
Значения по умолчанию вычисляются в их собственной области видимости....77
Значения по умолчанию не увеличивают арность функции....79
Остаточные параметры....79
Висящие запятые в списках параметров и вызовах функций....81
Свойство имени функции....83
Объявления функций внутри блоков....84
Объявления функций внутри блоков: Стандартная семантика....86
Объявления функций внутри блоков: Устаревшая веб-семантика....88
От старых привычек к новым....90
Используйте стрелочные функции вместо различных обходных путей для этого значения....90
Используйте стрелочные функции для обратных вызовов, если не используете аргументы или this....91
Рассмотрите применение стрелочных функций и в других местах....91
Не используйте стрелочные функции, когда вызывающей стороне необходимо контролировать значение this....92
Используйте значения параметров по умолчанию, а не код, предоставляющий значения по умолчанию....93
Используйте остаточный параметр вместо ключевого слова arguments....93
Рассмотрите возможность использования висящих запятых, если это оправдано....93
4. Классы....95
Что такое класс?....96
Представление нового синтаксиса класса....96
Добавление конструктора....98
Добавление свойств экземпляра....100
Добавление метода прототипа....100
Добавление статического метода....102
Добавление свойства- акцессора....103
Вычисляемые имена методов....105
Сравнение с устаревшим синтаксисом....105
Создание подклассов....108
Ключевое слово super....111
Написание конструкторов подклассов....112
Наследование свойств и методов прототипа суперкласса и доступ к ним....113
Наследование статических методов....117
Ключевое слово super в статических методах....118
Методы, возвращающие новые экземпляры....119
Создание подклассов для встроенных компонентов....124
Где доступен super....125
Отказ от Object.prototype....129
Синтаксис new.target....129
Объявления классов в сравнении с выражениями классов....133
Объявления классов....133
Выражения классов....134
Еще не все....135
От старых привычек к новым....135
Использование класса при создании функций конструктора....135
5. Объекты....137
Вычисляемые имена свойств....137
Стенография свойств....138
Получение и настройка прототипа объекта....139
Метод Object.setPrototypeOf....139
Свойство __proto__ в браузерах....140
Буквальное указание имени свойства __proto__ в браузерах....141
Синтаксис метода и применение super вне классов....141
Тип данных Symbol....144
Почему же символы?....145
Создание и использование символов....146
Символы не для конфиденциальности....147
Глобальные символы....148
Хорошо известные символы....152
Новые функции объектов....153
Метод Object.assign....153
Метод Object.is....154
Метод Object.values....155
Метод Object.entries....155
Метод Object.fromEntries....156
Функция Object.getOwnPropertySymbols....156
Метод Object.getOwnPropertyDescriptors....156
Метод Symbol.toPrimitive....157
Порядок свойств....159
Синтаксис расширения свойств....161
От старых привычек к новым....162
Использовать вычисляемый синтаксис при создании свойств с динамическими именами....162
Используйте сокращенный синтаксис при инициализации свойства из переменной с тем же именем....163
Используйте метод Object.assign вместо пользовательских функций «extend» или явного копирования всех свойств....163
Используйте синтаксис расширения при создании нового объекта на основе свойств существующего объекта....163
Используйте символ, чтобы избежать коллизии имен....163
Используйте методы Object.getPrototypeOf/setPrototypeOf вместо свойства __proto....164
Используйте синтаксис метода для методов....164
6. Возможности итерации: итерируемые объекты, итераторы, циклы for-of, итеративные расширения, генераторы....165
Итерируемые объекты, итераторы, циклы for-of, итерируемое расширение....165
Итераторы и итерируемые объекты....166
Цикл for-of: Неявное использование итератора....166
Явное использование итератора....168
Остановка итерации на ранней стадии....169
Прототип итератора объекта....170
Сделать что-либо итерируемым объектом....173
Итерируемые итераторы....177
Синтаксис итеративного расширения....179
Итераторы, цикл for-of и DOM....180
Функции- генераторы....182
Базовая функция-генератор, просто производящая значения....183
Использование функций- генераторов для создания итераторов....184
Функции- генераторы в качестве методов....186
Использование генератора напрямую....187
Потребление значений генераторами....187
Использование оператора return в функции- генераторе....191
Приоритет оператора yield....192
Методы return и throw: Завершение работы генератора....193
Остановка генератора или итеративного объекта: yield....195
От старых привычек к новым....200
Используйте конструкции с итеративными элементами....200
Используйте возможности итеративных коллекций DOM....201
Используйте интерфейсы итераторов и итеративных объектов....201
Используйте синтаксис итеративного расширения в большинстве мест, где вы применяли Function.prototype.apply....201
Используйте генераторы....202
7. Деструктуризация....203
Краткий обзор....203
Базовая деструктуризация объекта....204
Базовая (и итеративная) деструктуризация массива....207
Значения по умолчанию....209
Синтаксис Rest в шаблонах деструктуризации....211
Использование отличающихся имен....212
Вычисляемые имена свойств....214
Вложенная деструктуризация....214
Деструктуризация параметров....215
Деструктуризация в циклах....218
От старых привычек к новым....219
Используйте деструктуризацию при получении только некоторых свойств от объекта....219
Используйте деструктуризацию для объектов options....220
8. Объекты Promise....221
Почему же промисы?....221
Основы промисов....222
Краткий обзор....222
Пример....224
Промисы и элементы thenable....226
Использование существующего промиса....227
Метод then....227
Связывание промисов в цепочки....228
Сравнение с обратными вызовами....232
Метод catch....233
Метод finally....235
Метод throw в обработчиках then, catch и finally....239
Метод then с двумя аргументами....241
Добавление обработчиков к уже выполненным промисам....243
Создание промисов....244
Конструктор Promise....245
Метод Promise.resolve....248
Метод Promise.reject....249
Другие служебные методы промисов....250
Метод Promise.all....250
Метод Promise.race....252
Метод Promise.allSettled....252
Метод Promise.any....253
Шаблоны промисов....253
Обрабатывать ошибки или возвращать промис....253
Серии промисов....254
Параллельные промисы....256
Антишаблоны промисов....257
Излишнее выражение new Promise(/*…*/)....257
Отсутствие обработки ошибок (или неправильная обработка)....257
Оставление ошибок незамеченными при преобразовании API обратного вызова....258
Неявное преобразование отклонения в успешное выполнение....259
Попытка использовать результаты вне цепочки....260
Использование обработчиков бездействия....260
Неправильное разветвление цепочки....261
Подклассы промисов....262
От старых привычек к новым....263
Используйте промисы вместо успешных/неудачных обратных вызовов....263
9. Асинхронные функции, итераторы и генераторы....264
Асинхронные функции....264
Создание промисов асинхронными функциями....267
Оператор await использует промисы....268
Стандартная логика становится асинхронной при использовании await....269
Отклонения — это исключения, исключения — это отклонения; выполнение — это результаты, возвращаемые значения — это разрешения....270
Параллельные операции в асинхронных функциях....273
Нет необходимости возвращать await....274
Ловушка Pitfall: Использование асинхронной функции в неожиданном месте....275
Асинхронные итераторы, итерируемые и генераторы....276
Асинхронные итераторы....276
Асинхронные генераторы....280
Выражение for-await-of....282
От старых привычек к новым....283
Используйте асинхронные функции и await вместо явных промисов и then/catch....283
10. Шаблоны, помеченные функции и новые возможности строк....284
Шаблонные литералы....284
Базовая функциональность (Непомеченные шаблонные литералы)....285
Помеченные шаблонные функции (Помеченные шаблонные литералы)....287
Метод String.raw....292
Повторное использование шаблонных литералов....294
Шаблонные литералы и автоматическая вставка точки с запятой....294
Улучшенная поддержка Юникода....294
Юникод, а что такое строка JavaScript?....295
Экранирующая последовательность кодовой точки....297
Метод String.fromCodePoint....297
Метод String.prototype.codePointAt....297
Метод String.prototype.normalize....298
Итерация....300
Новые строковые методы....301
Метод String.prototype.repeat....301
Методы String.prototype.startsWith и String.prototype.endsWith....302
Метод String.prototype.includes....303
Методы String.prototype.padStart и String.prototype.padEnd....303
Методы String.prototype.trimStart и String.prototype.trimEnd....304
Обновления методов match, split, search и replace....304
От старых привычек к новым....306
Используйте шаблонные литералы вместо конкатенации строк (где это уместно)....306
Используйте помеченные функции и шаблонные литералы для DSL вместо пользовательских механизмов заполнения....307
Используйте строковые итераторы....307
11. Массивы....308
Новые методы массивов....308
Метод Array.of....308
Метод Array.from....309
Метод Array.prototype.keys....312
Метод Array.prototype.values....313
Метод Array.prototype.entries....314
Метод Array.prototype.copyWithin....315
Метод Array.prototype.find....318
Метод Array.prototype.findIndex....319
Метод Array.prototype.fill....319
Общая ловушка Pitfall: Использование объекта в качестве значения заполнения....320
Метод Array.prototype.includes....321
Метод Array.prototype.flat....321
Метод Array.prototype.flatMap....323
Итерация, расширение, деструктуризация....323
Стабильная сортировка массива....323
Типизированные массивы....324
Краткий обзор....324
Основное использование....327
Подробнее о преобразовании значений....328
Объект ArrayBuffer: Хранилище для типизированных массивов....330
Порядковый номер (Порядок байтов)....333
Вид DataView: Необработанный доступ к буферу....334
Совместное использование ArrayBuffer массивами....336
Совместное использование без перекрытия....336
Совместное использование с перекрытием....337
Подклассы типизированных массивов....338
Методы типизированного массива....338
Стандартные методы массива....338
Метод %TypedArray%.prototype.set....340
Метод %TypedArray%.prototype.subarray....340
От старых привычек к новым....341
Используйте find и findIndex для поиска в массивах вместо циклов (где это уместно)....341
Используйте для заполнения массивов Array.fill, а не циклы....341
Используйте readAsArrayBuffer вместо readAsBinaryString....342
12. Карты и множества....343
Коллекции Map или карты....343
Основные операции с картой....344
Равенство ключей....346
Создание карт из итерируемых....347
Итерация содержимого карты....348
Создание подклассов для карты....350
Производительность....351
Множества....351
Основные операции с множеством....352
Создание множеств из итерируемых....353
Итерация содержимого множества....353
Создание подклассов для множества....355
Производительность....355
Слабые карты (WeakMap)....356
Слабые карты не итерируемые....356
Варианты использования и примеры....356
Вариант использования: Закрытая информация....357
Вариант использования: Хранение информации для объектов, находящихся вне вашего контроля....358
Значения, ссылающиеся на ключ....360
Слабые множества (WeakSet)....365
Вариант использования: Отслеживание....366
Вариант использования: Маркировка....367
От старых привычек к новым....368
Используйте карты вместо объектов для карт общего назначения....368
Используйте множества вместо объектов для множеств....368
Используйте слабые карты для хранения личных данных вместо публичных свойств....369
13. Модули....371
Введение в модули....371
Основы модулей....372
Спецификатор модуля....374
Базовый именованный экспорт....375
Экспорт по умолчанию....377
Использование модулей в браузерах....379
Скрипты модуля не задерживают синтаксический анализ....380
Атрибут nomodule....380
Спецификаторы модулей в Интернете....381
Использование модулей в Node.js....382
Спецификаторы модулей в Node.js....384
Node.js добавляет дополнительные возможности модулей....385
Переименование экспорта....385
Повторный экспорт экспорта из другого модуля....386
Переименование импорта....387
Импорт объекта пространства имен модуля....388
Экспорт объекта пространства имен другого модуля....389
Импорт модуля только из-за побочных эффектов....390
Импорт и экспорт записей....390
Импорт записей....390
Экспорт записей....391
Импорт в режиме реального времени и доступности только для чтения....393
Экземпляры модуля зависят от базы realm....396
Как загружаются модули....396
Получение и синтаксический анализ....398
Создание экземпляра....401
Выполнение....402
Обзор временной мертвой зоны (TDZ)....402
Циклические зависимости и TDZ....403
Обзор синтаксиса импорта/экспорта....404
Разновидности экспорта....404
Разновидности импорта....406
Динамический импорт....407
Динамический импорт модуля....407
Пример динамического модуля....409
Динамический импорт в немодульных скриптах....412
Встряхивание дерева....414
Бандлинг (Объединение)....416
Метаданные импорта....416
Модули воркеров....417
Загрузка веб-воркера в качестве модуля....417
Загрузка воркера Node.js в качестве модуля....418
Воркер находится в собственной базе realm....418
От старых привычек к новым....419
Используйте модули вместо псевдо пространств имен....419
Используйте модули вместо обертывания кода в функции области видимости....420
Используйте модули, чтобы избежать создания мегалитических файлов кода....420
Конвертируйте CJS, AMD и другие модули в ESM....420
Не изобретайте велосипед, используйте хорошо обслуживаемый бандлер....420
14. Рефлексия - объекты Reflect и Proxy....421
Объект Reflect....421
Метод Reflect.apply....423
Метод Reflect.construct....423
Метод Reflect.ownKeys....425
Методы Reflect.get и Reflect.set....425
Другие функции Reflect....427
Объект Proxy....427
Пример: Регистрирующий прокси....431
Ловушки прокси....438
Общие возможности....438
Ловушка apply....439
Ловушка construct....439
Ловушка defineProperty....439
Ловушка deleteProperty....441
Ловушка get....442
Ловушка getOwnPropertyDescriptor....443
Ловушка getPrototypeOf....444
Ловушка has....445
Ловушка isExtensible....445
Ловушка ownKeys....445
Ловушка preventExtensions....446
Ловушка set....447
Ловушка setPrototypeOf....447
Пример: Скрытие свойств....448
Отключаемые прокси....452
От старых привычек к новым....452
Используйте прокси, а не полагайтесь на потребляющий код, чтобы не изменять объекты API....453
Используйте прокси для отделения кода реализации от инструментального кода....453
15. Обновления регулярных выражений....454
Свойство flags....454
Новые флаги....455
Липкий флаг (y)....455
Флаг Юникода (u)....456
Флаг «все точки» (s)....456
Именованные группы захвата....457
Основная функциональность....457
Обратные ссылки....461
Заменяющие токены....462
Утверждения ретроспективной проверки....462
Позитивная ретроспективная проверка....463
Негативная ретроспективная проверка....464
Жадность проявляется в принципе справа налево в ретроспективных проверках....464
Ссылки и нумерация групп захвата....465
Функциональные возможности Юникода....466
Экранирование кодовой точки....466
Экранирование свойства Юникода....467
От старых привычек к новым....471
Используйте липкий флаг (y) вместо создания подстрок и использования «^» при синтаксическом анализе....471
Используйте флаг «все точки» (s) вместо использования обходных путей для сопоставления всех символов (включая разрывы строк)....472
Используйте именованные группы захвата вместо анонимных....472
Используйте ретроспективные проверки вместо различных обходных путей....473
Используйте экранирование кодовой точки вместо суррогатных пар в регулярных выражениях....473
Используйте шаблоны Юникода вместо обходных путей....473
16. Совместно используемая память....474
Введение....474
Здесь водятся драконы!....475
Поддержка браузера....476
Основы совместно используемой памяти....477
Критические секции, блокировки и условные переменные....478
Создание совместно используемой памяти....479
Совместно используется память, но не объекты....484
Условия гонки, вышедшие из строя хранилища, устаревшие значения, значения с разрывами, тиринг и многое другое....485
Объект Atomics....487
Низкоуровневые возможности объекта Atomics....490
Использование Atomics для приостановки и возобновления потоков....492
Пример совместно используемой памяти....493
Здесь водятся драконы! (Снова)....514
От старых привычек к новым....520
Используйте совместно используемые блоки вместо многократного обмена большими блоками данных....520
Используйте Atomics.wait и Atomics.notify вместо разделения заданий воркеров для поддержки цикла событий (при необходимости)....520
17. Различные аспекты....521
Тип данных BigInt....521
Создание значения типа BigInt....523
Явное и неявное преобразование....524
Производительность....525
Массивы BigInt64Array и BigUint64Array....525
Служебные функции....525
Новые целочисленные литералы....526
Двоичные целочисленные литералы....526
Восьмеричные целочисленные литералы, попытка № 2....527
Новые математические методы....528
Общие математические функции....528
Поддержка низкоуровневых математических функций....529
Оператор возведения в степень (**)....529
Изменения в Date.prototype.toString....531
Изменения в Function.prototype.toString....532
Дополнения конструктора Number....532
«Безопасные» целые числа....532
Константы Number.MAX_SAFE_INTEGER и Number.MIN_SAFE_INTEGER....533
Метод Number.isSafeInteger....534
Метод Number.isInteger....534
Методы Number.isFinite и Number.isNaN....534
Методы Number.parseInt и Number.parseFloat....535
Свойство Number.EPSILON....535
Символ Symbol.isConcatSpreadable....535
Различные хитрости синтаксиса....536
Оператор нулевого слияния....537
Опциональная цепочка....537
Необязательные привязки catch....540
Разрывы строк Юникода в JSON....540
Правильно сформированный JSON из метода JSON.stringify....540
Различные стандартные библиотеки/глобальные дополнения....541
Метод Symbol.hasInstance....541
Свойство Symbol.unscopables....541
Объект globalThis....543
Свойство description символа....543
Метод String.prototype.matchAll....544
Приложение Б: Возможности, доступные только для браузера....544
HTML-подобные комментарии....545
Хитрости регулярного выражения....546
Расширение управляющего символа экранирования (\cX)....546
Допуск недопустимых последовательностей....547
Метод RegExp.prototype.compile....547
Дополнительные встроенные свойства....547
Дополнительные свойства объекта....548
Дополнительные строковые методы....549
Различные фрагменты свободного или неясного синтаксиса....549
Когда же document.all есть… или нет?....551
Оптимизация хвостового вызова....552
От старых привычек к новым....555
Используйте двоичные литералы....555
Используйте новые математические функции вместо различных математических обходных путей....556
Используйте оператор нулевого слияния для значений по умолчанию....556
Используйте опциональную цепочку вместо проверок....556
Уберите привязку ошибки (e) из “catch (e)”, если она не используется....556
Используйте оператор возведения в степень (**) вместо метода Math.pow....557
18. Грядущие функциональные возможности класса....558
Публичные и приватные поля класса, методы и акцессоры....558
Определения публичного поля (свойства)....559
Приватные поля....565
Приватные методы и акцессоры экземпляра....572
Приватные методы....572
Приватные акцессоры....577
Публичные статические поля, приватные статические поля и приватные статические методы....578
Публичные статические поля....578
Приватные статические поля....579
Приватные статические методы....579
От старых привычек к новым....580
Используйте определения свойств вместо создания свойств в конструкторе (где это уместно)....580
Используйте приватные поля вместо префиксов (где это уместно)....581
Используйте приватные методы вместо функций вне класса для приватных операций....581
19. Взгляд в будущее....584
Оператор await верхнего уровня....585
Обзор и примеры использования....585
Пример....587
Обработка ошибок....592
Слабые ссылки и обратные вызовы очистки....593
Слабые ссылки....594
Обратные вызовы очистки....597
Индексы соответствия RegExp....602
Метод String.prototype.replaceall....604
Выражение Atomics.asyncWait....605
Различные хитрости синтаксиса....606
Числовые разделители....606
Поддержка Hashbang....607
Осуждаемые устаревшие возможности RegExp....607
Спасибо, что прочитали!....608
Приложение. Фантастические возможности и где они обитают....609
Функциональные возможности в алфавитном порядке....609
Новые положения....615
Новый синтаксис, ключевые слова, операторы, циклы и тому подобное....616
Новые литеральные формы....618
Дополнения и изменения стандартной библиотеки....618
Прочее....621
Алфавитный указатель....622
Руководство по JavaScript для тех, кто хочет кодить быстро и эффективно.
"Новые возможности JavaScript" – это сборник правил написания кода на современном языке JavaScript. На наглядных примерах автор объясняет, как работают последние версии JS, какие приемы в нем можно использовать, чтобы сделать код коротким и чистым, а каких ошибок лучше избегать, чтобы не было багов.
Книга будет полезна всем, кто имеет по крайней мере базовое представление о JavaScript и хочет изучить новые возможности языка, появившиеся в последние годы.
Это не академическая книга для экспертов в программировании. Это практическая книга для обычных разработчиков на JavaScript, желающих развивать свои навыки программирования и идти в ногу со временем.