Новые возможности JavaScript: как написать чистый код по всем правилам современного языка

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Перед вами сборник правил написания кода на современном языке JavaScript. На наглядных примерах автор объясняет, как работают последние версии JS, какие приемы в нем можно использовать, чтобы сделать код коротким и чистым, а каких ошибок лучше избегать, чтобы не было багов.

Author(s): Ти Джей Краудер
Series: Мировой компьютерный бестселлер
Publisher: Эксмо
Year: 2023

Language: Russian
Pages: 640
City: М.
Tags: js

Оглавление
Об авторе
О техническом редакторе
О техническом корректоре
Благодарности
Введение
О чем эта книга?
Кому стоит читать эту книгу
Как пользоваться этой книгой
1. Новые возможности в ES2015–ES2020 и далее
Определения, что есть что и терминология
Что такое Ecma? ECMAScript? TC39?
Что такое ES6? ES7? ES2015? ES2020?
«Движки» JavaScript, браузеры и др.
Что за «новые возможности»?
Как создаются новые возможности?
Кто здесь главный
Процесс
Вовлечение в процесс
Следите за новыми возможностями
Использование текущих функций во вчерашних условиях и разрабатываемых возможностей сегодня
Транспилирование примера с помощью Babel
Обзор главы
2. Объявления блочной области видимости для let и const
Введение в let и const
Истинная блочная область видимости
Повторные объявления — это ошибка
Поднятие и временная мертвая зона
Новый вид глобальных переменных
Const: Константы в JavaScript
Основы const
Объекты, на которые ссылается const, по-прежнему изменяемы
Блочная область видимости в циклах
Проблема «замыканий в циклах»
Привязки: Как работают переменные, константы и другие идентификаторы
Циклы while и do-while
Последствия для производительности
Константа в блоках цикла
Константа в циклах for-in
От старых привычек к новым
Используйте const или let вместо var
Сохраняйте узкую область видимости переменных
Используйте блочную область видимости вместо встроенных анонимных функций
3. Функции
Стрелочные функции и лексические this, super и т.д.
Синтаксис стрелочной функции
Стрелочные функции и лексические this
Стрелочные функции не могут быть конструкторами
Значения параметров по умолчанию
Значения по умолчанию — это выражения
Значения по умолчанию вычисляются в их собственной области видимости
Значения по умолчанию не увеличивают арность функции
Остаточные параметры
Висящие запятые в списках параметров и вызовах функций
Свойство имени функции
Объявления функций внутри блоков
Объявления функций внутри блоков: Стандартная семантика
Объявления функций внутри блоков: Устаревшая веб-семантика
От старых привычек к новым
Используйте стрелочные функции вместо различных обходных путей для этого значения
Используйте стрелочные функции для обратных вызовов, если не используете аргументы или this
Рассмотрите применение стрелочных функций и в других местах
Не используйте стрелочные функции, когда вызывающей стороне необходимо контролировать значение this
Используйте значения параметров по умолчанию, а не код, предоставляющий значения по умолчанию
Используйте остаточный параметр вместо ключевого слова arguments
Рассмотрите возможность использования висящих запятых, если это оправдано
4. Классы
Что такое класс?
Представление нового синтаксиса класса
Добавление конструктора
Добавление свойств экземпляра
Добавление метода прототипа
Добавление статического метода
Добавление свойства-акцессора
Вычисляемые имена методов
Сравнение с устаревшим синтаксисом
Создание подклассов
Ключевое слово super
Написание конструкторов подклассов
Наследование свойств и методов прототипа суперкласса и доступ к ним
Наследование статических методов
Ключевое слово super в статических методах
Методы, возвращающие новые экземпляры
Создание подклассов для встроенных компонентов
Где доступен super
Отказ от Object.prototype
Синтаксис new.target
Объявления классов в сравнении с выражениями классов
Объявления классов
Выражения классов
Еще не все
От старых привычек к новым
Использование класса при создании функций конструктора
5. Объекты
Вычисляемые имена свойств
Стенография свойств
Получение и настройка прототипа объекта
Метод Object.setPrototypeOf
Свой ство __proto__ в браузерах
Буквальное указание имени свойства __proto__ в браузерах
Синтаксис метода и применение super вне классов
Тип данных Symbol
Почему же символы?
Создание и использование символов
Символы не для конфиденциальности
Глобальные символы
Хорошо известные символы
Новые функции объектов
Метод Object.assign
Метод Object.is
Метод Object.values
Метод Object.entries
Метод Object.fromEntries
Функция Object.getOwnPropertySymbols
Метод Object.getOwnPropertyDescriptors
Метод Symbol.toPrimitive
Порядок свойств
Синтаксис расширения свойств
От старых привычек к новым
Использовать вычисляемый синтаксис при создании свойств с динамическими именами
Используйте сокращенный синтаксис при инициализации свойства из переменной с тем же именем
Используйте метод Object.assign вместо пользовательских функций «extend» или явного копирования всех свойств
Используйте синтаксис расширения при создании нового объекта на основе свойств существующего объекта
Используйте символ, чтобы избежать коллизии имен
Используйте методы Object.getPrototypeOf/setPrototypeOf вместо свойства __proto__
Используйте синтаксис метода для методов
6. Возможности итерации: итерируемые объекты, итераторы, циклы for-of, итеративные расширения, генераторы
Итерируемые объекты, итераторы, циклы for-of, итерируемое расширение
Итераторы и итерируемые объекты
Цикл for-of: Неявное использование итератора
Явное использование итератора
Остановка итерации на ранней стадии
Прототип итератора объекта
Сделать что-либо итерируемым объектом
Итерируемые итераторы
Синтаксис итеративного расширения
Итераторы, цикл for-of и DOM
Функции- генераторы
Базовая функция- генератор, просто производящая значения
Использование функций- генераторов для создания итераторов
Функции- генераторы в качестве методов
Использование генератора напрямую
Потребление значений генераторами
Использование оператора return в функции- генераторе
Приоритет оператора yield
Методы return и throw: Завершение работы генератора
Остановка генератора или итеративного объекта: yield
От старых привычек к новым
Используйте конструкции с итеративными элементами
Используйте возможности итеративных коллекций DOM
Используйте интерфейсы итераторов и итеративных объектов
Используйте синтаксис итеративного расширения в большинстве мест, где вы применяли Function.prototype.apply
Используйте генераторы
7. Деструктуризация
Краткий обзор
Базовая деструктуризация объекта
Базовая (и итеративная) деструктуризация массива
Значения по умолчанию
Синтаксис Rest в шаблонах деструктуризации
Использование отличающихся имен
Вычисляемые имена свойств
Вложенная деструктуризация
Деструктуризация параметров
Деструктуризация в циклах
От старых привычек к новым
Используйте деструктуризацию при получении только некоторых свойств от объекта
Используйте деструктуризацию для объектов options
8. Объекты Promise
Почему же промисы?
Основы промисов
Краткий обзор
Пример
Промисы и элементы thenable
Использование существующего промиса
Метод then
Связывание промисов в цепочки
Сравнение с обратными вызовами
Метод catch
Метод finally
Метод throw в обработчиках then, catch и finally
Метод then с двумя аргументами
Добавление обработчиков к уже выполненным промисам
Создание промисов
Конструктор Promise
Метод Promise.resolve
Метод Promise.reject
Другие служебные методы промисов
Метод Promise.all
Метод Promise.race
Метод Promise.allSettled
Метод Promise.any
Шаблоны промисов
Обрабатывать ошибки или возвращать промис
Серии промисов
Параллельные промисы
Антишаблоны промисов
Излишнее выражение new Promise(/*…*/)
Отсутствие обработки ошибок (или неправильная обработка)
Оставление ошибок незамеченными при преобразовании API обратного вызова
Неявное преобразование отклонения в успешное выполнение
Попытка использовать результаты вне цепочки
Использование обработчиков бездействия
Неправильное разветвление цепочки
Подклассы промисов
От старых привычек к новым
Используйте промисы вместо успешных/неудачных обратных вызовов
9. Асинхронные функции, итераторы и генераторы
Асинхронные функции
Создание промисов асинхронными функциями
Оператор await использует промисы
Стандартная логика становится асинхронной при использовании await
Отклонения — это исключения, исключения — это отклонения; выполнение — это результаты, возвращаемые значения — это разрешения
Параллельные операции в асинхронных функциях
Нет необходимости возвращать await
Ловушка Pitfall: Использование асинхронной функции в неожиданном месте
Асинхронные итераторы, итерируемые и генераторы
Асинхронные итераторы
Асинхронные генераторы
Выражение for-await-of
От старых привычек к новым
Используйте асинхронные функции и await вместо явных промисов и then/catch
10. Шаблоны, помеченные функции и новые возможности строк
Шаблонные литералы
Базовая функциональность (Непомеченные шаблонные литералы)
Помеченные шаблонные функции (Помеченные шаблонные литералы)
Метод String.raw
Повторное использование шаблонных литералов
Шаблонные литералы и автоматическая вставка точки с запятой
Улучшенная поддержка Юникода
Юникод, а что такое строка JavaScript?
Экранирующая последовательность кодовой точки
Метод String.fromCodePoint
Метод String.prototype.codePointAt
Метод String.prototype.normalize
Итерация
Новые строковые методы
Метод String.prototype.repeat
Методы String.prototype.startsWith и String.prototype.endsWith
Метод String.prototype.includes
Методы String.prototype.padStart и String.prototype.padEnd
Методы String.prototype.trimStart и String.prototype.trimEnd
Обновления методов match, split, search и replace
От старых привычек к новым
Используйте шаблонные литералы вместо конкатенации строк (где это уместно)
Используйте помеченные функции и шаблонные литералы для DSL вместо пользовательских механизмов заполнения
Используйте строковые итераторы
11. Массивы
Новые методы массивов
Метод Array.of
Метод Array.from
Метод Array.prototype.keys
Метод Array.prototype.values
Метод Array.prototype.entries
Метод Array.prototype.copyWithin
Метод Array.prototype.find
Метод Array.prototype.findIndex
Метод Array.prototype.fill
Общая ловушка Pitfall: Использование объекта в качестве значения заполнения
Метод Array.prototype.includes
Метод Array.prototype.flat
Метод Array.prototype.flatMap
Итерация, расширение, деструктуризация
Стабильная сортировка массива
Типизированные массивы
Краткий обзор
Основное использование
Подробнее о преобразовании значений
Объект ArrayBuffer: Хранилище для типизированных массивов
Порядковый номер (Порядок байтов)
Вид DataView: Необработанный доступ к буферу
Совместное использование ArrayBuffer массивами
Совместное использование без перекрытия
Совместное использование с перекрытием
Подклассы типизированных массивов
Методы типизированного массива
Стандартные методы массива
Метод %TypedArray%.prototype.set
Метод %TypedArray%.prototype.subarray
От старых привычек к новым
Используйте find и findIndex для поиска в массивах вместо циклов (где это уместно)
Используйте для заполнения массивов Array.fill, а не циклы
Используйте readAsArrayBuffer вместо readAsBinaryString
12. Карты и множества
Коллекции Map или карты
Основные операции с картой
Равенство ключей
Создание карт из итерируемых
Итерация содержимого карты
Создание подклассов для карты
Производительность
Множества
Основные операции с множеством
Создание множеств из итерируемых
Итерация содержимого множества
Создание подклассов для множества
Производительность
Слабые карты (WeakMap)
Слабые карты не итерируемые
Варианты использования и примеры
Вариант использования: Закрытая информация
Вариант использования: Хранение информации для объектов, находящихся вне вашего контроля
Значения, ссылающиеся на ключ
Слабые множества (WeakSet)
Вариант использования: Отслеживание
Вариант использования: Маркировка
От старых привычек к новым
Используйте карты вместо объектов для карт общего назначения
Используйте множества вместо объектов для множеств
Используйте слабые карты для хранения личных данных вместо публичных свойств
13. Модули
Введение в модули
Основы модулей
Спецификатор модуля
Базовый именованный экспорт
Экспорт по умолчанию
Использование модулей в браузерах
Скрипты модуля не задерживают синтаксический анализ
Атрибут nomodule
Спецификаторы модулей в Интернете
Использование модулей в Node.js
Спецификаторы модулей в Node.js
Node.js добавляет дополнительные возможности модулей
Переименование экспорта
Повторный экспорт экспорта из другого модуля
Переименование импорта
Импорт объекта пространства имен модуля
Экспорт объекта пространства имен другого модуля
Импорт модуля только из-за побочных эффектов
Импорт и экспорт записей
Импорт записей
Экспорт записей
Импорт в режиме реального времени и доступности только для чтения
Экземпляры модуля зависят от базы realm
Как загружаются модули
Получение и синтаксический анализ
Создание экземпляра
Выполнение
Обзор временной мертвой зоны (TDZ)
Циклические зависимости и TDZ
Обзор синтаксиса импорта/экспорта
Разновидности экспорта
Разновидности импорта
Динамический импорт
Динамический импорт модуля
Пример динамического модуля
Динамический импорт в немодульных скриптах
Встряхивание дерева
Бандлинг (Объединение)
Метаданные импорта
Модули воркеров
Загрузка веб-воркера в качестве модуля
Загрузка воркера Node.js в качестве модуля
Воркер находится в собственной базе realm
От старых привычек к новым
Используйте модули вместо псевдо пространств имен
Используйте модули вместо обертывания кода в функции области видимости
Используйте модули, чтобы избежать создания мегалитических файлов кода
Конвертируйте CJS, AMD и другие модули в ESM
Не изобретайте велосипед, используйте хорошо обслуживаемый бандлер
14. Рефлексия — объекты Reflect и Proxy
Объект Reflect
Метод Reflect.apply
Метод Reflect.construct
Метод Reflect.ownKeys
Методы Reflect.get и Reflect.set
Другие функции Reflect
Объект Proxy
Пример: Регистрирующий прокси
Ловушки прокси
Общие возможности
Ловушка apply
Ловушка construct
Ловушка deneProperty
Ловушка deleteProperty
Ловушка get
Ловушка getOwnPropertyDescriptor
Ловушка getPrototypeOf
Ловушка has
Ловушка isExtensible
Ловушка ownKeys
Ловушка preventExtensions
Ловушка set
Ловушка setPrototypeOf
Пример: Скрытие свойств
Отключаемые прокси
От старых привычек к новым
Используйте прокси, а не полагайтесь на потребляющий код, чтобы не изменять объекты API
Используйте прокси для отделения кода реализации от инструментального кода
15. Обновления регулярных выражений
Свойство flags
Новые флаги
Липкий флаг (y)
Флаг Юникода (u)
Флаг «все точки» (s)
Именованные группы захвата
Основная функциональность
Обратные ссылки
Заменяющие токены
Утверждения ретроспективной проверки
Позитивная ретроспективная проверка
Негативная ретроспективная проверка
Жадность проявляется в принципе справа налево в ретроспективных проверках
Ссылки и нумерация групп захвата
Функциональные возможности Юникода
Экранирование кодовой точки
Экранирование свойства Юникода
От старых привычек к новым
Используйте липкий флаг (y) вместо создания подстрок и использования «^» при синтаксическом анализе
Используйте флаг «все точки» (s) вместо использования обходных путей для сопоставления всех символов (включая разрывы строк)
Используйте именованные группы захвата вместо анонимных
Используйте ретроспективные проверки вместо различных обходных путей
Используйте экранирование кодовой точки вместо суррогатных пар в регулярных выражениях
Используйте шаблоны Юникода вместо обходных путей
16. Совместно используемая память
Введение
Здесь водятся драконы!
Поддержка браузера
Основы совместно используемой памяти
Критические секции, блокировки и условные переменные
Создание совместно используемой памяти
Совместно используется память, но не объекты
Условия гонки, вышедшие из строя хранилища, устаревшие значения, значения с разрывами, тиринг и многое другое
Объект Atomics
Низкоуровневые возможности объекта Atomics
Использование Atomics для приостановки и возобновления потоков
Пример совместно используемой памяти
Здесь водятся драконы! (Снова)
От старых привычек к новым
Используйте совместно используемые блоки вместо многократного обмена большими блоками данных
Используйте Atomics.wait и Atomics.notify вместо разделения заданий воркеров для поддержки цикла событий (при необходимости)
17. Различные аспекты
Тип данных BigInt
Создание значения типа BigInt
Явное и неявное преобразование
Производительность
Массивы BigInt64Array и BigUint64Array
Служебные функции
Новые целочисленные литералы
Двоичные целочисленные литералы
Восьмеричные целочисленные литералы, попытка № 2
Новые математические методы
Общие математические функции
Поддержка низкоуровневых математических функций
Оператор возведения в степень (**)
Изменения в Date.prototype.toString
Изменения в Function.prototype.toString
Дополнения конструктора Number
«Безопасные» целые числа
Константы Number.MAX_SAFE_INTEGER и Number.MIN_SAFE_INTEGER
Метод Number.isSafeInteger
Метод Number.isInteger
Методы Number.isFinite и Number.isNaN
Методы Number.parseInt и Number.parseFloat
Свойство Number.EPSILON
Символ Symbol.isConcatSpreadable
Различные хитрости синтаксиса
Оператор нулевого слияния
Опциональная цепочка
Необязательные привязки catch
Разрывы строк Юникода в JSON
Правильно сформированный JSON из метода JSON.stringify
Различные стандартные библиотеки/глобальные дополнения
Метод Symbol.hasInstance
Свойство Symbol.unscopables
Объект globalThis
Свойство description символа
Метод String.prototype.matchAll
Приложение Б: Возможности, доступные только для браузера
HTML-подобные комментарии
Хитрости регулярного выражения
Расширение управляющего символа экранирования (\cX)
Допуск недопустимых последовательностей
Метод RegExp.prototype.compile
Дополнительные встроенные свойства
Дополнительные свойства объекта
Дополнительные строковые методы
Различные фрагменты свободного или неясного синтаксиса
Когда же document.all есть… или нет?
Оптимизация хвостового вызова
От старых привычек к новым
Используйте двоичные литералы
Используйте новые математические функции вместо различных математических обходных путей
Используйте оператор нулевого слияния для значений по умолчанию
Используйте опциональную цепочку вместо проверок &&
Уберите привязку ошибки (e) из “catch (e)”, если она не используется
Используйте оператор возведения в степень (**) вместо метода Math.pow
18. Грядущие функциональные возможности класса
Публичные и приватные поля класса, методы и акцессоры
Определения публичного поля (свойства)
Приватные поля
Приватные методы и акцессоры экземпляра
Приватные методы
Приватные акцессоры
Публичные статические поля, приватные статические поля и приватные статические методы
Публичные статические поля
Приватные статические поля
Приватные статические методы
От старых привычек к новым
Используйте определения свойств вместо создания свойств в конструкторе (где это уместно)
Используйте приватные поля вместо префиксов (где это уместно)
Используйте приватные методы вместо функций вне класса для приватных операций
19. Взгляд в будущее…
Оператор await верхнего уровня
Обзор и примеры использования
Пример
Обработка ошибок
Слабые ссылки и обратные вызовы очистки
Слабые ссылки
Обратные вызовы очистки
Индексы соответствия RegExp
Метод String.prototype.replaceall
Выражение Atomics.asyncWait
Различные хитрости синтаксиса
Числовые разделители
Поддержка Hashbang
Осуждаемые устаревшие возможности RegExp
Спасибо, что прочитали!
Приложение. Фантастические возможности и где они обитают
Функциональные возможности в алфавитном порядке
Новые положения
Новый синтаксис, ключевые слова, операторы, циклы и тому подобное
Новые литеральные формы
Дополнения и изменения стандартной библиотеки
Прочее
Алфавитный указатель