Оглавление ....5
Содержание ....6
Об авторе ....19
Об иллюстрации на обложке ....19
Предисловие ....20
Соглашения, используемые в этой книге ....20
Использование примеров кода ....21
Благодарности ....21
Ждем ваших отзывов! ....22
ГЛАВА 1 ....23
Введение в JavaScript ....23
1.1. Исследование JavaScript ....25
1.2. Программа "Hello World" ....27
1.3. Тур по JavaScript ....27
1.4. Пример: гистограмма частоты использования символов ....34
1.5. Резюме ....37
Лексическая структура ....39
2.1. Текст программы JavaScript ....39
2.2. Комментарии ....40
2.3. Литералы ....40
2.4. Идентификаторы и зарезервированные слова ....40
2.4.1. Зарезервированные слова ....41
2.5. Unicode ....42
2.5.1. Управляющие последовательности Unicode ....42
2.6. Необязательные точки с запятой ....43
2.7. Резюме ....45
Типы, значения и переменные ....47
3.1. Обзор и определения ....47
3.2. Числа ....49
3.2.1. Целочисленные литералы ....50
3.2.2. Числовые литералы с плавающей точкой ....50
3.2.3. Арифметические действия в JavaScript ....51
3.2.4. Двоичное представление чисел с плавающей точкой и ошибки округления ....54
3.2.5. Целые числа произвольной точности с использованием Bigint ....55
3.2.6. Дата и время ....56
3.3. Текст ....56
3.3.1. Строковые литералы ....57
3.3.2. Управляющие последовательности в строковых литералах ....58
3.3.3. Работа со строками ....60
3.3.4. Шаблонные литералы ....61
3.3.5. Сопоставление с шаблонами ....63
3.4. Булевские значения ....63
3.6. Тип Symbol ....66
3.7. Глобальный объект ....67
3.8. Неизменяемые элементарные значения и изменяемые объектные ссылки ....68
3.9. Преобразования типов ....70
3.9.1. Преобразования и равенство ....72
3.9.2. Явные преобразования ....72
3.9.3. Преобразования объектов в элементарные значения ....74
3.10. Объявление и присваивание переменных ....78
3,10.1. Объявление с помощью let и const ....79
В.10.2. Объявление переменных с помощью var ....81
3.10.3. Деструктурирующее присваивание ....83
3.11. Резюме ....86
ГЛАВА 4 ....87
Выражения и операции ....87
4.1. Первичные выражения ....87
4.2. Инициализаторы объектов и массивов ....88
4.3. Выражения определений функций ....89
4.4. Выражения доступа к свойствам ....90
4.4.1- Условный доступ к свойствам ....91
4.5. Выражения вызова ....92
4.5.1. Условный вызов ....93
4.6. Выражения создания объектов ....94
47. Обзор операций ....95
4.7.1. Количество операндов ....97
4.7.2. Типы операндов и результата ....98
4.7.3. Побочные эффекты операций ....98
4 7.4. Приоритеты операций ....99
4.7.5. Ассоциативность операций ....100
4.7.6. Порядок вычисления ....100
4.8. Арифметические выражения ....101
4.8.1. Операция + ....102
4.8.2. Унарные арифметические операции ....103
4.8.3. Побитовые операции ....104
4.9. Выражения отношений ....106
4.9.1. Операции равенства и неравенства ....106
4.9.2. Операции сравнения ....109
4.10. Логические выражения ....112
4.10.1. Логическое И (&&) ....112
4.10.2. Логическое ИЛИ (| |) ....113
4.10.3. Логическое НЕ (!) ....114
4.11. Выражения присваивания ....115
4.11.1. Присваивание с действием ....115
4.12. Вычисление выражений ....116
4.12.1. eval () ....117
4.12.2. eval () в глобальном контексте ....118
4.12.3. eval () в строгом режиме ....119
4.13. Смешанные операции ....120
4.13.1. Условная операция (?:) ....120
4.13.2. Операция выбора первого определенного операнда (??) ....120
4.13.3. Операция typeof ....122
4.13.4. Операция delete ....122
4.13.5. Операция await ....124
4.13.6. Операция void ....124
4.13.7. Операция "запятая" ....124
4.14. Резюме ....125
Операторы ....127
5.1. Операторы-выражения ....128
5.2. Составные и пустые операторы ....129
5.3. Условные операторы ....130
5.3.1. if ....130
5.4. Циклы ....135
5.4.1. while ....135
5.5. Переходы ....142
5.5.1. Помеченные операторы ....143
5.6. Смешанные операторы ....151
5.7. Объявления ....154
5.8. Резюме по операторам JavaScript ....157
Объекты ....159
6.1. Введение в объекты ....159
6.2. Создание объектов ....160
6.3. Запрашивание и установка свойств ....163
6.3.1. Объекты как ассоциативные массивы ....164
6.3.2. Наследование ....166
б.З.З. Ошибки доступа к свойствам ....167
6.4. Удаление свойств ....168
6.5. Проверка свойств ....169
6.6. Перечисление свойств ....171
6.6.1. Порядок перечисления свойств ....172
6.7. Расширение объектов ....172
6.8. Сериализация объектов ....174
6.9. Методы Object ....174
6.9.3. Метод valueOf () ....176
6.9.4. Метод toJSONO ....176
6.10. Расширенный синтаксис объектных литералов ....177
6.10.1. Сокращенная запись свойств ....177
6.10.2. Вычисляемые имена свойств ....177
6.10.3. Символы в качестве имен свойств ....178
6.10.4. Операция распространения ....179
6.10.5. Сокращенная запись методов ....180
6.10.6. Методы получения и установки свойств ....181
6.11. Резюме ....184
Массивы ....185
7.1. Создание массивов ....186
7.1.1. Литералы типа массивов ....186
7.1.2. Операция распространения ....187
7.1.3. Конструктор Array () ....187
7.2. Чтение и запись элементов массива ....189
7.3. Разреженные массивы ....190
7.4. Длина массива ....191
7.5. Добавление и удаление элементов массива ....192
7.6. Итерация по массивам ....193
7.7. Многомерные массивы ....194
7.8. Методы массивов ....195
^•8.1. Методы итераторов для массивов ....195
7.8.2. Выравнивание массивов с помощью flat() и flatMap() ....200
7.8.3. Присоединение массивов с помощью concatO ....200
7.8.4. Организация стеков и очередей с помощью push(), pop (), shift () и unshift () ....201
7.8.5. Работа с подмассивами с помощью ....202
7.8.6. Методы поиска и сортировки массивов ....204
7.8.7- Преобразования массивов в строки ....207
^•8.8. Статические функции массивов ....207
7.9. Объекты, похожие на массивы ....208
7.10. Строки как массивы ....210
7.11. Резюме ....210
Функции ....211
8.1. Определение функций ....212
8.1.1. Объявления функций ....212
8.1.4. Вложенные функции ....216
8.2. Вызов функций ....216
8.2.2. Вызов метода ....218
8.2.3. Вызов конструктора ....221
8.2.4. Косвенный вызов функции ....222
8.2.5. Неявный вызов функции ....222
8.3. Аргументы и параметры функций ....223
8.3.1. Необязательные параметры и стандартные значения ....223
g.3.2. Параметры остатка и списки аргументов переменной длины ....225
8.3.3. Объект Arguments ....225
8.3.4. Операция распространения для вызовов функций ....226
8.3.5. Деструктуризация аргументов функции в параметры ....227
8.3.6. Типы аргументов ....230
8.4. Функции как значения ....231
3.4.1. Определение собственных свойств функций ....233
8.5. Функции как пространства имен ....234
8.6. Замыкания ....235
8.7. Свойства( методы и конструктор функций ....240
8.7.1. Свойство length ....240
8.7.5. Метод bind () ....242
8.7.6. Метод toString () ....243
8.7.7. Конструктор Function () ....243
8.8. Функциональное программирование ....244
8.8.1- Обработка массивов с помощью функций ....245
8.8.2. Функции высшего порядка ....246
8.8.3. Функции с частичным применением ....247
8.8.4. Мемоизация ....249
8.9. Резюме ....250
Классы ....251
9.1. Классы и прототипы ....252
9.2. Классы и конструкторы ....254
9,2-1- Конструкторы, идентичность классов и операция instanceof ....257
9.3. Классы с ключевым словом class ....259
9.3.1. Статические методы ....262
9.3.2. Методы получения, установки и других видов ....262
9,3.3. Открытые, закрытые и статические поля ....263
9.3.4. Пример: класс для представления комплексных чисел ....265
9.4. Добавление методов в существующие классы ....266
9-5. Подклассы ....267
9.5.1. Подклассы и прототипы ....268
9.5.2. Создание подклассов с использованием extends и super ....269
9.5.3. Делегирование вместо наследования ....272
9.5.4. Иерархии классов и абстрактные классы ....274
9.6. Резюме ....279
Модули ....281
10.1. Модули, использующие классы, объекты и замыкания ....282
Автоматизация модульности на основе замыканий ....283
10.2. Модули в Node ....284
10.2.1 Экспортирование в Node ....285
10.2.2. Импортирование в Node ....286
10.2-3- Модули в стиле Node для веб-сети ....287
10.3. Модули в ES6 ....287
10.3.1. Экспортирование в ES6 ....288
10.3.2. Импортирование в ES6 ....289
Ю.З.З. Импортирование и экспортирование с переименованием ....291
10.3.4. Повторное экспортирование ....292
10.3.5. Модули JavaScript для веб-сети ....294
10.3.6. Динамическое импортирование с помощью import О ....296
10.4. Резюме ....298
Стандартная ....299
библиотека ....299
JavaScript ....299
11.1. Множества и отображения ....300
11.1.1. Класс Set ....300
11.1.2. Класс Мар ....303
11.1.3. WeakMap и WeakSet ....306
11.2. Типизированные массивы и двоичные данные ....307
11.2.3. Использование типизированных массивов ....310
11.2.4. Методы и свойства типизированных массивов ....311
11.2.5. DataView и порядок байтов ....313
11.3. Сопоставление с образцом с помощью регулярных выражений ....314
11.3.1- Определение регулярных выражений ....315
11.3.2. Строковые методы для сопоставления с образцом ....326
11.3.3. Класс RegExp ....331
<11.4. Дата и время ....335
11.4.1. Отметки времени ....336
11.4.2. Арифметические действия с датами ....337
11.4.3. Форматирование и разбор строк с датами ....338
11.5. Классы ошибок ....339
11.6. Сериализация и разбор данных в формате JS0N ....340
11.6.1. Настройка JSON ....342
11.7. API-интерфейс интернационализации ....344
11.7.1. Форматирование чисел ....344
11.7.2. Форматирование даты и времени ....346
11.7.3. Сравнение строк ....349
H.8. API-интерфейс Console ....351
11.8.1. Форматирование вывода с помощью API-интерфейса Console ....354
11.9. API-интерфейсы URL ....354
11.9.1. Унаследованные функции для работы с URL ....357
11.10. Таймеры ....358
11.11. Резюме ....359
Итераторы и генераторы ....361
12.1. Особенности работы итераторов ....362
12.2. Реализация итерируемых объектов ....363
12.2.1. "Закрытие" итератора: метод return () ....366
12.3. Генераторы ....367
12.3.1. Примеры генераторов ....368
12.3.2. yield* и рекурсивные генераторы ....370
12.4. Расширенные возможности генераторов ....371
12.4.1. Возвращаемое значение генераторной функции ....371
12.4.2. Значение выражения yield ....372
12.4.3. Методы return () и throw () генератора ....373
12.4.4. Финальное замечание о генераторах ....374
12.5. Резюме ....374
Асинхронный ....375
JavaScript ....375
13.1. Асинхронное программирование ....376
с использованием обратных вызовов ....376
13.1.1. Таймеры ....376
0,1.2. События ....377
13.1.3. События сети ....377
13.1.4. Обратные вызовы и события в Node ....379
13.2. Объекты Promise ....380
13.2.1. Использование объектов Promise ....382
13.2.2. Выстраивание объектов Promise в цепочки ....385
13.2.3. Разрешение объектов Promise ....388
13.2.4. Дополнительные сведения ....390
об объектах Promise и ошибках ....390
13.2.5. Параллельное выполнение нескольких ....396
асинхронных операций с помощью Promise ....396
13,2.6. Создание объектов Promise ....397
13.2.7. Последовательное выполнение нескольких асинхронных операций с помощью Promise ....401
13.3. async и await ....404
13.3.1. Выражения await ....404
13.3.2. Функции async ....404
13.3.3. Ожидание множества объектов Promise ....405
13.3.4. Детали реализации ....406
13.4. Асинхронная итерация ....406
13.4.2. Асинхронные итераторы ....408
<13.4.3. Асинхронные генераторы ....409
П.4.4. Реализация асинхронных итераторов ....409
13.5. Резюме ....414
Метапрограммирование ....415
14.1. Атрибуты свойств ....416
14.2. Расширяемость объектов ....420
14.3. Атрибут prototype ....422
14.4. Хорошо известные объекты Symbol ....423
14.4.6. Объекты Symbol для сопоставления с образцом ....429
14.5. Теги шаблонов ....432
14.6. API-интерфейс Reflect ....434
14.7. Объекты Proxy ....436
14.8. Резюме ....443
JavaScript в веб-браузерах ....445
15.1. Основы программирования для веб-сети ....448
15.1.1. Код JavaScript в HTML-дескрипторах ....448
15.1.2, Объектная модель документа ....451
15.1.3. Глобальный объект в веб-браузерах ....453
15.1.4. Сценарии разделяют пространство имен ....454
15,1.5. Выполнение программ JavaScript ....455
15.1.6. Ввод и вывод программы ....458
15.1.7. Ошибки в программе ....459
15.1.8. Модель безопасности веб-сети ....460
15.2. События ....464
15.2.1. Категории событий ....466
15.2.2. Регистрация обработчиков событий ....467
15.2.3. Вызов обработчиков событий ....471
15.2-4. Распространение событий ....473
15.2.5. Отмена событий ....474
15.2.6. Отправка специальных событий ....474
15.3. Работа с документами в сценариях ....475
15.3.1. Выбор элементов документа ....476
15.3.2. Структура и обход документа ....479
15.3.3. Атрибуты ....482
15.3.4. Содержимое элементов ....484
15.3.5. Создание, вставка и удаление узлов ....486
15.3.6. Пример: генерация оглавления ....487
15.4. Работа с CSS в сценариях ....490
15.4.1. Классы CSS ....490
15.4.4. Работа с таблицами стилей в сценариях ....494
15.4.5. Анимация и события CSS ....495
15.5. Геометрия и прокрутка документов ....497
15.5.1. Координаты документа и координаты окна просмотра ....497
15.5.2. Запрашивание геометрии элемента ....499
15-5.3. Определение элемента в точке ....499
15.5.4. Прокрутка ....500
15.5.5. Размер окна просмотра, размер содержимого и позиция прокрутки ....501
15.6. Веб-компоненты ....502
15.6.1. Использование веб-компонентов ....503
15.6.2. Шаблоны HTML ....505
15.6.3. Специальные элементы ....506
15.6.4. Теневая модель DOM ....509
15.6.5. Пример: веб-компонент <search-box> ....511
15.7. SVG: масштабируемая векторная графика ....516
15.7.1. SVG в HTML ....516
15.7.2. Работа с SVG в сценариях ....518
15.7.3. Создание изображений SVG с помощью JavaScript ....519
15.8. Графика в <canvas> ....522
15.8.1. Пути и многоугольники ....524
О® ....526
15.8.2. Размеры и координаты холста ....527
15.8.3. Графические атрибуты ....528
15.8.4. Операции рисования холста ....533
15.8.5. Трансформации системы координат ....538
15.8.6. Отсечение ....542
15.8.7. Манипулирование пикселями ....543
15.9. API-интерфейсы Audio ....545
15.9.1. Конструктор Audio () ....545
15.9.2. API-интерфейс WebAudio ....546
15.10. Местоположение, навигация и хронология ....547
15.10.1. Загрузка новых документов ....548
15.10.2. Хронология просмотра ....549
15.10.3. Управление хронологией с помощью событий "hashchange" ....550
15.10.4. Управление хронологией с помощью метода pushState () ....551
15.11. Взаимодействие с сетью ....557
15.11.1. fetch () ....557
15.11.2. События, посылаемые сервером ....568
15.11.3. Веб-сокеты ....572
15.12. Хранилище ....574
15.12.2. Cookie-наборы ....578
15.12.3. IndexedDB ....582
15.13. Потоки воркеров и обмен сообщениями ....587
15.13.1. Объекты воркеров ....588
15.13.2. Глобальный объект в воркерах ....589
15.13.3. Импортирование кода в воркер ....590
15.13.4. Модель выполнения воркеров ....591
15.13.6. Обмен сообщениями между разными ....594
источниками с помощью postMessage () ....594
15.14. Пример: множество Мандельброта ....595
15.15. Резюме и рекомендации ....608<br> относительно дальнейшего чтения ....608
15.15.1. HTML и CSS ....609
15.15.2. Производительность ....610
15.15.3. Безопасность ....610
15.15.4. WebAssembly ....610
15.15.5. Дополнительные средства объектов Document и Window ....611
15.15.6. События ....612
15.15.7. Прогрессивные веб-приложения и служебные воркеры ....613
15.15.8. API-интерфейсы мобильных устройств ....614
15.15.9. API-интерфейсы для работы с двоичными данными ....615
15.15.10. API-интерфейсы для работы с медиаданными ....615
15.15.11. API-интерфейсы для работы с криптографией и связанные с ними API-интерфейсы ....615
JavaScript на стороне сервера с использованием ....617
Node ....617
16.1. Основы программирования в Node ....618
16.1.1. Вывод на консоль ....618
16.1.2. Аргументы командной строки и переменные среды ....619
16.1.3. Жизненный цикл программы ....620
16.1.4. Модули Node ....621
16.1.5. Диспетчер пакетов Node ....622
16.2. Среда Node асинхронна по умолчанию ....623
16.3. Буферы ....627
16.5. Потоки данных ....631
16.5.1. Каналы ....634
16.5.2. Асинхронная итерация ....636
16.5.3. Запись в потоки и обработка противодавления ....637
16.5.4. Чтение потоков с помощью событий ....640
16.6. Информация о процессе, центральном процессоре и операционной системе ....643
16.7. Работа с файлами ....645
16.7.1. Пути, файловые дескрипторы и объекты FileHandle ....646
16.7.2. Чтение из файлов ....647
16.7.3. Запись в файлы ....650
16.7.4. Файловые операции ....652
16.7.5. Метаданные файлов ....653
16.7.6. Работа с каталогами ....654
16.8. Клиенты и серверы HTTP ....656
16.9. Сетевые серверы и клиенты, не использующие HTTP ....661
16.10. Работа с дочерними процессами ....664
16.10.2. ехес () иexecFile() ....666
16.10.3. spawn () ....667
16.10.4. fork () ....668
16.11. Потоки воркеров ....669
16.11.1. Создание воркеров и передача сообщений ....671
16.11.2. Среда выполнения воркеров ....673
16.11.3. Каналы связи и объекты MessagePort ....674
16.11.4. Передача объектов MessagePort и типизированных массивов ....675
16.11.5. Разделение типизированных массивов между потоками ....677
16.12. Резюме ....679
Инструменты и расширения JavaScript ....681
17.1. Линтинг с помощью ESLint ....682
17.2. Форматирование кода JavaScript с помощью Prettier ....683
17.3. Модульное тестирование с помощью Jest ....684
17.4. Управление пакетами с помощью npm ....687
17.5. Пакетирование кода ....689
17.6. Транспиляция с помощью Babel ....691
17.7. JSX: выражения разметки в JavaScript ....692
17.8. Контроль типов с помощью Flow ....697
17.8.1. Установка и запуск Flow ....699
17.8.2. Использование аннотаций типов ....700
17.8.3. Типы классов ....703
17.8.4. Типы объектов ....704
17.8.5. Псевдонимы типов ....705
17.8.6. Типы массивов ....705
17.8.7. Другие параметризированные типы ....707
17.8.8. Типы, допускающие только чтение ....709
17.8.9. Типы функций ....709
17.8.10. Типы объединений ....710
17.8.11. Перечислимые типы и различающие объединения ....711
17.9. Резюме ....713
Предметный указатель ....714
Содержание ....721
JavaScript — это язык программирования для веб-сети, который в настоящее время используется большим количеством разработчиков программного обеспечения, чем любой другой язык программирования. В течение почти 25 лет этот бестселлер служил исчерпывающим руководством для программистов на JavaScript, и новое издание книги полностью обновлено с целью охвата версии 2020 языка JavaScript. Повсюду в книге вы будете находить яркие и привлекательные примеры кода. Вам также предлагаются новые главы, в которых раскрываются классы, модули, итераторы, генераторы, объекты Promise и async/await.
Книга предназначена для программистов, желающих изучить язык JavaScript, и для разработчиков веб-приложений, которые стремятся повысить уровень своих знаний и мастерства.