Содержание
Об авторе 19
Предисловие 20
Соглашения, используемые в этой книге 20
Использование примеров кода 21
Благодарности 21
Ждем ваших отзывов! 22
ГЛАВА 1. Введение в JavaScript 23
1.1. Исследование JavaScript 25
1.2. Программа “Hello World” 27
1.3. Тур по JavaScript 27
1.4. Пример: гистограмма частоты использования символов 34
1.5. Резюме 37
ГЛАВА 2. Лексическая структура 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.5.2. Нормализация Unicode 43
2.6. Необязательные точки с запятой 43
2.7. Резюме 45
ГЛАВА 3. Типы, значения и переменные 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.5. null и undefined 65
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
3.10.2. Объявление переменных с помощью var 81
3.10.3. Деструктурирующее присваивание 83
3.11. Резюме 86
ГЛАВА 4. Выражения и операции 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
4.7. Обзор операций 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.9.3. Операция in 111
4.9.4. Операция instanceof 111
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
ГЛАВА 5. Операторы 127
5.1. Операторы-выражения 128
5.2. Составные и пустые операторы 129
5.3. Условные операторы 130
5.3.1. if 130
5.3.2. else if 132
5.3.3. switch 133
5.4. Циклы 135
5.4.1. while 135
5.4.2. do/while 136
5.4.3. for 136
5.4.4. for/of 138
5.4.5. for/in 141
5.5. Переходы 142
5.5.1. Помеченные операторы 143
5.5.2. break 144
5.5.3. continue 145
5.5.4. return 146
5.5.5. yield 147
5.5.6. throw 147
5.5.7. try/catch/finally 148
5.6. Смешанные операторы 151
5.6.1. with 151
5.6.2. debugger 152
5.6.3. "use strict" 152
5.7. Объявления 154
5.7.1. const, let и var 155
5.7.2. function 155
5.7.3. class 156
5.7.4. import и export 156
5.8. Резюме по операторам JavaScript 157
ГЛАВА 6. Объекты 159
6.1. Введение в объекты 159
6.2. Создание объектов 160
6.2.1. Объектные литералы 161
6.2.2. Создание объектов с помощью операции new 161
6.2.3. Прототипы 162
6.2.4. Object.create() 163
6.3. Запрашивание и установка свойств 163
6.3.1. Объекты как ассоциативные массивы 164
6.3.2. Наследование 166
6.3.3. Ошибки доступа к свойствам 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.1. Метод toString() 175
6.9.2. Метод toLocaleString() 175
6.9.3. Метод valueOf() 176
6.9.4. Метод toJSON() 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
ГЛАВА 7. Массивы 185
7.1. Создание массивов 186
7.1.1. Литералы типа массивов 186
7.1.2. Операция распространения 187
7.1.3. Конструктор Array() 187
7.1.4. Array.of() 188
7.1.5. Array.from() 188
7.2. Чтение и запись элементов массива 189
7.3. Разреженные массивы 190
7.4. Длина массива 191
7.5. Добавление и удаление элементов массива 192
7.6. Итерация по массивам 193
7.7. Многомерные массивы 194
7.8. Методы массивов 195
7.8.1. Методы итераторов для массивов 195
7.8.2. Выравнивание массивов с помощью flat() и flatMap() 200
7.8.3. Присоединение массивов с помощью concat() 200
7.8.4. Организация стеков и очередей с помощью push(), pop(), shift()
и unshift() 201
7.8.5. Работа с подмассивами с помощью slice(), splice(), fill()
и copyWithin() 202
7.8.6. Методы поиска и сортировки массивов 204
7.8.7. Преобразования массивов в строки 207
7.8.8. Статические функции массивов 207
7.9. Объекты, похожие на массивы 208
7.10. Строки как массивы 210
7.11. Резюме 210
ГЛАВА 8. Функции 211
8.1. Определение функций 212
8.1.1. Объявления функций 212
8.1.2. Выражения функций 214
8.1.3. Стрелочные функции 215
8.1.4. Вложенные функции 216
8.2. Вызов функций 216
8.2.1. Вызов функции 217
8.2.2. Вызов метода 218
8.2.3. Вызов конструктора 221
8.2.4. Косвенный вызов функции 222
8.2.5. Неявный вызов функции 222
8.3. Аргументы и параметры функций 223
8.3.1. Необязательные параметры и стандартные значения 223
8.3.2. Параметры остатка и списки аргументов переменной длины 225
8.3.3. Объект Arguments 225
8.3.4. Операция распространения для вызовов функций 226
8.3.5. Деструктуризация аргументов функции в параметры 227
8.3.6. Типы аргументов 230
8.4. Функции как значения 231
8.4.1. Определение собственных свойств функций 233
8.5. Функции как пространства имен 234
8.6. Замыкания 235
8.7. Свойства, методы и конструктор функций 240
8.7.1. Свойство length 240
8.7.2. Свойство name 241
8.7.3. Свойство prototype 241
8.7.4. Методы call() и apply() 241
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
ГЛАВА 9. Классы 251
9.1. Классы и прототипы 252
9.2. Классы и конструкторы 254
9.2.1. Конструкторы, идентичность классов и операция instanceof 257
9.2.2. Свойство constructor 258
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
ГЛАВА 10. Модули 281
10.1. Модули, использующие классы, объекты и замыкания 282
10.1.1. Автоматизация модульности на основе замыканий 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
10.3.3. Импортирование и экспортирование с переименованием 291
10.3.4. Повторное экспортирование 292
10.3.5. Модули JavaScript для веб-сети 294
10.3.6. Динамическое импортирование с помощью import() 296
10.3.7. import.meta.url 298
10.4. Резюме 298
ГЛАВА 11. Стандартная библиотека JavaScript 299
11.1. Множества и отображения 300
11.1.1. Класс Set 300
11.1.2. Класс Map 303
11.1.3. WeakMap и WeakSet 306
11.2. Типизированные массивы и двоичные данные 307
11.2.1. Типы типизированных массивов 308
11.2.2. Создание типизированных массивов 309
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. Сериализация и разбор данных в формате JSON 340
11.6.1. Настройка JSON 342
11.7. API-интерфейс интернационализации 344
11.7.1. Форматирование чисел 344
11.7.2. Форматирование даты и времени 346
11.7.3. Сравнение строк 349
11.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
ГЛАВА 12. Итераторы и генераторы 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
ГЛАВА 13. Асинхронный JavaScript 375
13.1. Асинхронное программирование с использованием обратных вызовов 376
13.1.1. Таймеры 376
13.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. Дополнительные сведения об объектах Promise и ошибках 390
13.2.5. Параллельное выполнение нескольких асинхронных операций
с помощью 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.1. Цикл for/await 407
13.4.2. Асинхронные итераторы 408
13.4.3. Асинхронные генераторы 409
13.4.4. Реализация асинхронных итераторов 409
13.5. Резюме 414
ГЛАВА 14. Метапрограммирование 415
14.1. Атрибуты свойств 416
14.2. Расширяемость объектов 420
14.3. Атрибут prototype 422
14.4. Хорошо известные объекты Symbol 423
14.4.1. Symbol.iterator и Symbol.asyncIterator 424
14.4.2. Symbol.hasInstance 424
14.4.3. Symbol.toStringTag 425
14.4.4. Symbol.species 426
14.4.5. Symbol.isConcatSpreadable 428
14.4.6. Объекты Symbol для сопоставления с образцом 429
14.4.7. Symbol.toPrimitive 430
14.4.8. Symbol.unscopables 431
14.5. Теги шаблонов 432
14.6. API-интерфейс Reflect 434
14.7. Объекты Proxy 436
14.7.1. Инварианты Proxy 442
14.8. Резюме 443
ГЛАВА 15. JavaScript в веб-браузерах 445
15.1. Основы программирования для веб-сети 448
15.1.1. Код JavaScript в HTML-дескрипторах