Новые возможности JavaScript: как написать чистый код по всем правилам современного языка Год издания: 2023 Автор: Краудер Ти Джей Переводчик: Райтман М. А. Издательство: Бомбора / Эксмо ISBN: 978-5-04-159515-9 Серия: Мировой компьютерный бестселлер Язык: Русский Формат: PDF Качество: Издательский макет или текст (eBook) Количество страниц: 634 Описание: Перед вами сборник правил написания кода на современном языке JavaScript. На наглядных примерах автор объясняет, как работают последние версии JS, какие приемы в нем можно использовать, чтобы сделать код коротким и чистым, а каких ошибок лучше избегать, чтобы не было багов.
Примеры страниц
Оглавление
ОБ АВТОРЕ 20 О ТЕХНИЧЕСКОМ РЕДАКТОРЕ 21 О ТЕХНИЧЕСКОМ КОРРЕКТОРЕ 21 БЛАГОДАРНОСТИ 22 ВВЕДЕНИЕ 23 О чем эта книга? 23 Кому стоит читать эту книгу 25 Как пользоваться этой книгой 25 ГЛАВА 1. НОВЫЕ ВОЗМОЖНОСТИ В ES2015ES2020 И ДАЛЕЕ 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 45 Введение в let и const 46 Истинная блочная область видимости 46 Повторные объявления — это ошибка 47 Поднятие и временная мертвая зона 48 Новый вид глобальных переменных 51 Const: Константы в JavaScript 53 Основы const 53 Объекты, на которые ссылается const, по-прежнему изменяемы 54 Блочная область видимости в циклах 55 Проблема «замыканий в циклах» 56 Привязки: Как работают переменные, константы и другие идентификаторы 57 Циклы while и do-while 62 Последствия для производительности 63 Константа в блоках цикла 64 Константа в циклах for-in 65 От старых привычек к новым 66 Используйте const или let вместо var 66 Сохраняйте узкую область видимости переменных 66 Используйте блочную область видимости вместо встроенных анонимных функций 66 ГЛАВА 3. ФУНКЦИИ 69 Стрелочные функции и лексические this, super и т. д. 70 Синтаксис стрелочной функции 70 Стрелочные функции и лексические this 75 Стрелочные функции не могут быть конструкторами 75 Значения параметров по умолчанию 76 Значения по умолчанию — это выражения 78 Значения по умолчанию вычисляются в их собственной области видимости 79 Значения по умолчанию не увеличивают арность функции 81 Остаточные параметры 81 Висящие запятые в списках параметров и вызовах функций 83 Свой ство имени функции 85 Объявления функций внутри блоков 86 Объявления функций внутри блоков: Стандартная семантика 88 Объявления функций внутри блоков: Устаревшая веб-семантика 90 От старых привычек к новым 92 Используйте стрелочные функции вместо различных обходных путей для этого значения 92 Используйте стрелочные функции для обратных вызовов, если не используете аргументы или this 93 Рассмотрите применение стрелочных функций и в других местах 93 Не используйте стрелочные функции, когда вызывающей стороне необходимо контролировать значение this 94 Используйте значения параметров по умолчанию, а не код, предоставляющий значения по умолчанию 95 Используйте остаточный параметр вместо ключевого слова arguments 95 Рассмотрите возможность использования висящих запятых, если это оправдано 95 ГЛАВА 4. КЛАССЫ 97 Что такое класс? 98 Представление нового синтаксиса класса 98 Добавление конструктора 100 Добавление свой ств экземпляра 102 Добавление метода прототипа 102 Добавление статического метода 104 Добавление свой ства- акцессора 105 Вычисляемые имена методов 107 Сравнение с устаревшим синтаксисом 107 Создание подклассов 110 Ключевое слово super 113 Написание конструкторов подклассов 114 Наследование свой ств и методов прототипа суперкласса и доступ к ним 115 Наследование статических методов 119 Ключевое слово super в статических методах 120 Методы, возвращающие новые экземпляры 121 Создание подклассов для встроенных компонентов 126 Где доступен super 127 Отказ от Object.prototype 131 Синтаксис new.target 131 Объявления классов в сравнении с выражениями классов 135 Объявления классов 135 Выражения классов 136 Еще не все 137 От старых привычек к новым 137 Использование класса при создании функций конструктора 137 ГЛАВА 5. ОБЪЕКТЫ 139 Вычисляемые имена свой ств 139 Стенография свой ств 140 Получение и настройка прототипа объекта 141 Метод Object.setPrototypeOf 141 Свой ство __proto__ в браузерах 142 Буквальное указание имени свой ства __proto__ в браузерах 143 Синтаксис метода и применение super вне классов 143 Тип данных Symbol 146 Почему же символы? 147 Создание и использование символов 148 Символы не для конфиденциальности 149 Глобальные символы 150 Хорошо известные символы 154 Новые функции объектов 155 Метод Object.assign 155 Метод Object.is 156 Метод Object.values 157 Метод Object.entries 157 Метод Object.fromEntries 158 Функция Object.getOwnPropertySymbols 158 Метод Object.getOwnPropertyDescriptors 158 Метод Symbol.toPrimitive 159 Порядок свой ств 161 Синтаксис расширения свой ств 163 От старых привычек к новым 164 Использовать вычисляемый синтаксис при создании свой ств с динамическими именами 164 Используйте сокращенный синтаксис при инициализации свой ства из переменной с тем же именем 165 Используйте метод Object.assign вместо пользовательских функций «extend» или явного копирования всех свой ств 165 Используйте синтаксис расширения при создании нового объекта на основе свой ств существующего объекта 165 Используйте символ, чтобы избежать коллизии имен 165 Используйте методы Object.getPrototypeOf/setPrototypeOf вместо свой ства __proto__ 166 Используйте синтаксис метода для методов 166 ГЛАВА 6. ВОЗМОЖНОСТИ ИТЕРАЦИИ: ИТЕРИРУЕМЫЕ ОБЪЕКТЫ, ИТЕРАТОРЫ, ЦИКЛЫ FOROF, ИТЕРАТИВНЫЕ РАСШИРЕНИЯ, ГЕНЕРАТОРЫ 167 Итерируемые объекты, итераторы, циклы for-of, итерируемое расширение 167 Итераторы и итерируемые объекты 168 Цикл for-of: Неявное использование итератора 168 Явное использование итератора 170 Остановка итерации на ранней стадии 171 Прототип итератора объекта 172 Сделать что-либо итерируемым объектом 175 Итерируемые итераторы 179 Синтаксис итеративного расширения 181 Итераторы, цикл for-of и DOM 182 Функции- генераторы 184 Базовая функция- генератор, просто производящая значения 185 Использование функций- генераторов для создания итераторов 186 Функции- генераторы в качестве методов 188 Использование генератора напрямую 189 Потребление значений генераторами 189 Использование оператора return в функции- генераторе 193 Приоритет оператора yield 194 Методы return и throw: Завершение работы генератора 195 Остановка генератора или итеративного объекта: yield* 197 От старых привычек к новым 202 Используйте конструкции с итеративными элементами 202 Используйте возможности итеративных коллекций DOM 203 Используйте интерфейсы итераторов и итеративных объектов 203 Используйте синтаксис итеративного расширения в большинстве мест, где вы применяли Function.prototype.apply 203 Используйте генераторы 204 ГЛАВА 7. ДЕСТРУКТУРИЗАЦИЯ 205 Краткий обзор 205 Базовая деструктуризация объекта 206 Базовая (и итеративная) деструктуризация массива 209 Значения по умолчанию 211 Синтаксис Rest в шаблонах деструктуризации 213 Использование отличающихся имен 214 Вычисляемые имена свой ств 216 Вложенная деструктуризация 216 Деструктуризация параметров 217 Деструктуризация в циклах 220 От старых привычек к новым 221 Используйте деструктуризацию при получении только некоторых свой ств от объекта 221 Используйте деструктуризацию для объектов options 222 ГЛАВА 8. ОБЪЕКТЫ PROMISE 223 Почему же промисы? 223 Основы промисов 224 Краткий обзор 224 Пример 226 Промисы и элементы thenable 228 Использование существующего промиса 229 Метод then 229 Связывание промисов в цепочки 230 Сравнение с обратными вызовами 234 Метод catch 235 Метод finally 237 Метод throw в обработчиках then, catch и finally 241 Метод then с двумя аргументами 243 Добавление обработчиков к уже выполненным промисам 245 Создание промисов 246 Конструктор Promise 247 Метод Promise.resolve 250 Метод Promise.reject 251 Другие служебные методы промисов 252 Метод Promise.all 252 Метод Promise.race 254 Метод Promise.allSettled 254 Метод Promise.any 255 Шаблоны промисов 255 Обрабатывать ошибки или возвращать промис 255 Серии промисов 256 Параллельные промисы 258 Антишаблоны промисов 259 Излишнее выражение new Promise(/*…*/) 259 Отсутствие обработки ошибок (или неправильная обработка) 259 Оставление ошибок незамеченными при преобразовании API обратного вызова 260 Неявное преобразование отклонения в успешное выполнение 261 Попытка использовать результаты вне цепочки 262 Использование обработчиков бездействия 262 Неправильное разветвление цепочки 263 Подклассы промисов 264 От старых привычек к новым 265 Используйте промисы вместо успешных/неудачных обратных вызовов 265 ГЛАВА 9. АСИНХРОННЫЕ ФУНКЦИИ, ИТЕРАТОРЫ И ГЕНЕРАТОРЫ 267 Асинхронные функции 267 Создание промисов асинхронными функциями 270 Оператор await использует промисы 271 Стандартная логика становится асинхронной при использовании await 272 Отклонения — это исключения, исключения — это отклонения; выполнение — это результаты, возвращаемые значения — это разрешения 273 Параллельные операции в асинхронных функциях 276 Нет необходимости возвращать await 277 Ловушка Pitfall: Использование асинхронной функции в неожиданном месте 278 Асинхронные итераторы, итерируемые и генераторы 279 Асинхронные итераторы 279 Асинхронные генераторы 283 Выражение for-await-of 285 От старых привычек к новым 286 Используйте асинхронные функции и await вместо явных промисов и then/catch 286 ГЛАВА 10. ШАБЛОНЫ, ПОМЕЧЕННЫЕ ФУНКЦИИ И НОВЫЕ ВОЗМОЖНОСТИ СТРОК 287 Шаблонные литералы 287 Базовая функциональность (Непомеченные шаблонные литералы) 288 Помеченные шаблонные функции (Помеченные шаблонные литералы) 290 Метод String.raw 295 Повторное использование шаблонных литералов 297 Шаблонные литералы и автоматическая вставка точки с запятой 297 Улучшенная поддержка Юникода 297 Юникод, а что такое строка JavaScript? 298 Экранирующая последовательность кодовой точки 300 Метод String.fromCodePoint 300 Метод String.prototype.codePointAt 300 Метод String.prototype.normalize 301 Итерация 303 Новые строковые методы 304 Метод String.prototype.repeat 304 Методы String.prototype.startsWith и String.prototype.endsWith 305 Метод String.prototype.includes 306 Методы String.prototype.padStart и String.prototype.padEnd 306 Методы String.prototype.trimStart и String.prototype.trimEnd 307 Обновления методов match, split, search и replace 307 От старых привычек к новым 309 Используйте шаблонные литералы вместо конкатенации строк (где это уместно) 309 Используйте помеченные функции и шаблонные литералы для DSL вместо пользовательских механизмов заполнения 310 Используйте строковые итераторы 310 ГЛАВА 11. МАССИВЫ 311 Новые методы массивов 311 Метод Array.of 311 Метод Array.from 312 Метод Array.prototype.keys 315 Метод Array.prototype.values 316 Метод Array.prototype.entries 317 Метод Array.prototype.copyWithin 318 Метод Array.prototype.find 321 Метод Array.prototype.findIndex 322 Метод Array.prototype.fill 322 Общая ловушка Pitfall: Использование объекта в качестве значения заполнения 323 Метод Array.prototype.includes 324 Метод Array.prototype.flat 324 Метод Array.prototype.flatMap 326 Итерация, расширение, деструктуризация 326 Стабильная сортировка массива 326 Типизированные массивы 327 Краткий обзор 327 Основное использование 330 Подробнее о преобразовании значений 331 Объект ArrayBuffer: Хранилище для типизированных массивов 333 Порядковый номер (Порядок байтов) 336 Вид DataView: Необработанный доступ к буферу 337 Совместное использование ArrayBuffer массивами 339 Совместное использование без перекрытия 339 Совместное использование с перекрытием 340 Подклассы типизированных массивов 341 Методы типизированного массива 341 Стандартные методы массива 341 Метод %TypedArray%.prototype.set 343 Метод %TypedArray%.prototype.subarray 343 От старых привычек к новым 344 Используйте find и findIndex для поиска в массивах вместо циклов (где это уместно) 344 Используйте для заполнения массивов Array.fill, а не циклы 344 Используйте readAsArrayBuffer вместо readAsBinaryString 345 ГЛАВА 12. КАРТЫ И МНОЖЕСТВА 347 Коллекции Map или карты 347 Основные операции с картой 348 Равенство ключей 350 Создание карт из итерируемых 351 Итерация содержимого карты 352 Создание подклассов для карты 354 Производительность 355 Множества 355 Основные операции с множеством 356 Создание множеств из итерируемых 357 Итерация содержимого множества 357 Создание подклассов для множества 359 Производительность 359 Слабые карты (WeakMap) 360 Слабые карты не итерируемые 360 Варианты использования и примеры 360 Вариант использования: Закрытая информация 361 Вариант использования: Хранение информации для объектов, находящихся вне вашего контроля 362 Значения, ссылающиеся на ключ 364 Слабые множества (WeakSet) 369 Вариант использования: Отслеживание 370 Вариант использования: Маркировка 371 От старых привычек к новым 372 Используйте карты вместо объектов для карт общего назначения 372 Используйте множества вместо объектов для множеств 372 Используйте слабые карты для хранения личных данных вместо публичных свой ств 373 ГЛАВА 13. МОДУЛИ 375 Введение в модули 375 Основы модулей 376 Спецификатор модуля 378 Базовый именованный экспорт 379 Экспорт по умолчанию 381 Использование модулей в браузерах 383 Скрипты модуля не задерживают синтаксический анализ 384 Атрибут nomodule 384 Спецификаторы модулей в Интернете 385 Использование модулей в Node.js 386 Спецификаторы модулей в Node.js 388 Node.js добавляет дополнительные возможности модулей 389 Переименование экспорта 389 Повторный экспорт экспорта из другого модуля 390 Переименование импорта 391 Импорт объекта пространства имен модуля 392 Экспорт объекта пространства имен другого модуля 393 Импорт модуля только из-за побочных эффектов 394 Импорт и экспорт записей 394 Импорт записей 394 Экспорт записей 395 Импорт в режиме реального времени и доступности только для чтения 397 Экземпляры модуля зависят от базы realm 400 Как загружаются модули 400 Получение и синтаксический анализ 402 Создание экземпляра 405 Выполнение 406 Обзор временной мертвой зоны (TDZ) 406 Циклические зависимости и TDZ 407 Обзор синтаксиса импорта/экспорта 408 Разновидности экспорта 408 Разновидности импорта 410 Динамический импорт 411 Динамический импорт модуля 411 Пример динамического модуля 413 Динамический импорт в немодульных скриптах 416 Встряхивание дерева 418 Бандлинг (Объединение) 420 Метаданные импорта 420 Модули воркеров 421 Загрузка веб-воркера в качестве модуля 421 Загрузка воркера Node.js в качестве модуля 422 Воркер находится в собственной базе realm 422 От старых привычек к новым 423 Используйте модули вместо псевдо пространств имен 423 Используйте модули вместо обертывания кода в функции области видимости 424 Используйте модули, чтобы избежать создания мегалитических файлов кода 424 Конвертируйте CJS, AMD и другие модули в ESM 424 Не изобретайте велосипед, используйте хорошо обслуживаемый бандлер 424 ГЛАВА 14. РЕФЛЕКСИЯ ОБЪЕКТЫ REFLECT И PROXY 425 Объект Reflect 425 Метод Reflect.apply 427 Метод Reflect.construct 427 Метод Reflect.ownKeys 429 Методы Reflect.get и Reflect.set 429 Другие функции Reflect 431 Объект Proxy 431 Пример: Регистрирующий прокси 435 Ловушки прокси 442 Общие возможности 442 Ловушка apply 443 Ловушка construct 443 Ловушка defineProperty 443 Ловушка deleteProperty 445 Ловушка get 446 Ловушка getOwnPropertyDescriptor 447 Ловушка getPrototypeOf 448 Ловушка has 449 Ловушка isExtensible 449 Ловушка ownKeys 449 Ловушка preventExtensions 450 Ловушка set 451 Ловушка setPrototypeOf 451 Пример: Скрытие свой ств 452 Отключаемые прокси 456 От старых привычек к новым 456 Используйте прокси, а не полагайтесь на потребляющий код, чтобы не изменять объекты API 457 Используйте прокси для отделения кода реализации от инструментального кода 457 ГЛАВА 15. ОБНОВЛЕНИЯ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ 459 Свой ство flags 459 Новые флаги 460 Липкий флаг (y) 460 Флаг Юникода (u) 461 Флаг «все точки» (s) 461 Именованные группы захвата 462 Основная функциональность 462 Обратные ссылки 466 Заменяющие токены 467 Утверждения ретроспективной проверки 467 Позитивная ретроспективная проверка 468 Негативная ретроспективная проверка 469 Жадность проявляется в принципе справа налево в ретроспективных проверках 469 Ссылки и нумерация групп захвата 470 Функциональные возможности Юникода 471 Экранирование кодовой точки 471 Экранирование свой ства Юникода 472 От старых привычек к новым 476 Используйте липкий флаг (y) вместо создания подстрок и использования «^» при синтаксическом анализе 476 Используйте флаг «все точки» (s) вместо использования обходных путей для сопоставления всех символов (включая разрывы строк). 477 Используйте именованные группы захвата вместо анонимных 477 Используйте ретроспективные проверки вместо различных обходных путей 478 Используйте экранирование кодовой точки вместо суррогатных пар в регулярных выражениях 478 Используйте шаблоны Юникода вместо обходных путей 478 ГЛАВА 16. СОВМЕСТНО ИСПОЛЬЗУЕМАЯ ПАМЯТЬ 479 Введение 479 Здесь водятся драконы! 480 Поддержка браузера 481 Основы совместно используемой памяти 482 Критические секции, блокировки и условные переменные 483 Создание совместно используемой памяти 484 Совместно используется память, но не объекты 489 Условия гонки, вышедшие из строя хранилища, устаревшие значения, значения с разрывами, тиринг и многое другое 490 Объект Atomics 492 Низкоуровневые возможности объекта Atomics 495 Использование Atomics для приостановки и возобновления потоков 497 Пример совместно используемой памяти 498 Здесь водятся драконы! (Снова) 519 От старых привычек к новым 525 Используйте совместно используемые блоки вместо многократного обмена большими блоками данных 525 Используйте Atomics.wait и Atomics.notify вместо разделения заданий воркеров для поддержки цикла событий (при необходимости) 525 ГЛАВА 17. РАЗЛИЧНЫЕ АСПЕКТЫ 527 Тип данных BigInt 527 Создание значения типа BigInt 529 Явное и неявное преобразование 530 Производительность 531 Массивы BigInt64Array и BigUint64Array 531 Служебные функции 531 Новые целочисленные литералы 532 Двоичные целочисленные литералы 532 Восьмеричные целочисленные литералы, попытка № 2 533 Новые математические методы 534 Общие математические функции 534 Поддержка низкоуровневых математических функций 535 Оператор возведения в степень (**) 535 Изменения в Date.prototype.toString 537 Изменения в Function.prototype.toString 538 Дополнения конструктора Number 538 «Безопасные» целые числа 538 Константы Number.MAX_SAFE_INTEGER и Number.MIN_SAFE_INTEGER 539 Метод Number.isSafeInteger 540 Метод Number.isInteger 540 Методы Number.isFinite и Number.isNaN 540 Методы Number.parseInt и Number.parseFloat 541 Свой ство Number.EPSILON 541 Символ Symbol.isConcatSpreadable 541 Различные хитрости синтаксиса 542 Оператор нулевого слияния 543 Опциональная цепочка 543 Необязательные привязки catch 546 Разрывы строк Юникода в JSON 546 Правильно сформированный JSON из метода JSON.stringify 546 Различные стандартные библиотеки/глобальные дополнения 547 Метод Symbol.hasInstance 547 Свой ство Symbol.unscopables 547 Объект globalThis 549 Свой ство description символа 549 Метод String.prototype.matchAll 550 Приложение Б: Возможности, доступные только для браузера 550 HTML-подобные комментарии 551 Хитрости регулярного выражения 552 Расширение управляющего символа экранирования (\cX) 552 Допуск недопустимых последовательностей 553 Метод RegExp.prototype.compile 553 Дополнительные встроенные свой ства 553 Дополнительные свой ства объекта 554 Дополнительные строковые методы 555 Различные фрагменты свободного или неясного синтаксиса 555 Когда же document.all есть… или нет? 557 Оптимизация хвостового вызова 558 От старых привычек к новым 561 Используйте двоичные литералы 561 Используйте новые математические функции вместо различных математических обходных путей 562 Используйте оператор нулевого слияния для значений по умолчанию 562 Используйте опциональную цепочку вместо проверок && 562 Уберите привязку ошибки (e) из “catch (e)”, если она не используется 562 Используйте оператор возведения в степень (**) вместо метода Math.pow 563 ГЛАВА 18. ГРЯДУЩИЕ ФУНКЦИОНАЛЬНЫЕ ВОЗМОЖНОСТИ КЛАССА 565 Публичные и приватные поля класса, методы и акцессоры 565 Определения публичного поля (свой ства) 566 Приватные поля 572 Приватные методы и акцессоры экземпляра 579 Приватные методы 579 Приватные акцессоры 584 Публичные статические поля, приватные статические поля и приватные статические методы 585 Публичные статические поля 585 Приватные статические поля 586 Приватные статические методы 586 От старых привычек к новым 587 Используйте определения свой ств вместо создания свой ств в конструкторе (где это уместно) 587 Используйте приватные поля вместо префиксов (где это уместно) 588 Используйте приватные методы вместо функций вне класса для приватных операций 588 ГЛАВА 19. ВЗГЛЯД В БУДУЩЕЕ… 591 Оператор await верхнего уровня 592 Обзор и примеры использования 592 Пример 594 Обработка ошибок 599 Слабые ссылки и обратные вызовы очистки 600 Слабые ссылки 601 Обратные вызовы очистки 604 Индексы соответствия RegExp 609 Метод String.prototype.replaceall 611 Выражение Atomics.asyncWait 612 Различные хитрости синтаксиса 613 Числовые разделители 613 Поддержка Hashbang 614 Осуждаемые устаревшие возможности RegExp 614 Спасибо, что прочитали! 615 ПРИЛОЖЕНИЕ. ФАНТАСТИЧЕСКИЕ ВОЗМОЖНОСТИ И ГДЕ ОНИ ОБИТАЮТ 617 Функциональные возможности в алфавитном порядке 617 Новые положения 623 Новый синтаксис, ключевые слова, операторы, циклы и тому подобное 624 Новые литеральные формы 626 Дополнения и изменения стандартной библиотеки 626 Прочее 629 АЛФАВИТНЫЙ УКАЗАТЕЛЬ 631
Мировой компьютерный бестселлер - Краудер Ти Джей - Новые возможности JavaScript: как написать чистый код по всем правилам современного языка [2023, PDF, RUS] download torrent for free and without registration
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum