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

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

Новые возможности JavaScript: Как написать чистый код по всем правилам современного языка
Автор: Краудер Ти Джей
Дата выхода: 2020
Издательство: Эксмо
Количество страниц: 634
Размер файла: 3.4 MB
Тип файла: PDF
Добавил: codelibs
 Проверить на вирусы

Оглавление....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 и хочет изучить новые возможности языка, появившиеся в последние годы.

 Благодаря ей вы узнаете:

  • чем последние версии JS отличаются друг от друга;
  • как расширился функционал объектов в коде;
  • что нового могут предложить функции;
  • как использовать современный синтаксис языка;
  • какими будут дальнейшие улучшения JS.

Это не академическая книга для экспертов в программировании. Это практическая книга для обычных разработчиков на JavaScript, желающих развивать свои навыки программирования и идти в ногу со временем.


Похожее:

Список отзывов:

Нет отзывов к книге.