выразительный джава скрипт 3 издание
Eloquent JavaScript
This is a book about JavaScript, programming, and the wonders of the digital. You can read it online here, or buy your own paperback copy.
Written by Marijn Haverbeke.
Licensed under a Creative Commons attribution-noncommercial license. All code in this book may also be considered licensed under an MIT license.
Illustrations by various artists: Cover and chapter illustrations by Madalina Tantareanu. Pixel art in Chapters 7 and 16 by Antonio Perdomo Pastor. Regular expression diagrams in Chapter 9 generated with regexper.com by Jeff Avallone. Village photograph in Chapter 11 by Fabrice Creuzot. Game concept for Chapter 16 by Thomas Palef.
The third edition was made possible by 325 financial backers, most notably and
. The second edition was supported by 454 backers, with significant contributions from
,
, and
.
Contents
(Part 1: Language)
(Part 2: Browser)
(Part 3: Node)
A paper version of Eloquent JavaScript, including an additional chapter, is being brought out by No Starch Press.
Выразительный JavaScript, Современное веб-проrраммирование, Хавербеке М., 2019
Выразительный JavaScript, Современное веб-проrраммирование, Хавербеке М., 2019.
действий. Важно отметить, что JavaScript никогда не имел ничего общего с языком программирования под названием Java. Похожее название было продиктовано не здравым смыслом, а маркетинговыми соображениями. Когда появился JavaScript, язык jаvа активно продавался и приобретал популярность. Кто то решил, что будет хорошей идеей бесплатно прокатиться на волне чужого успеха. Теперь приходится за это расплачиваться.
Краткое содержание
Введение.
Глава 1.Значения, типы и операторы.
Глава 2.Структура программы.
Глава 3.Функции.
Глава 4.Структуры данных: объекты и массивы.
Глава 5.Функции высшего порядка.
Глава 6.Тайная жизнь объектов.
Глава 7.Проект: робот.
Глава 8.Ошибки и дефекты.
Глава 9.Регулярные выражения.
Глава 10.Модули.
Глава 11.Асинхронное программирование.
Глава 12.Проект: язык программирования.
Глава 13.JavaScript и браузер.
Глава 14.Объектная модель документа.
Глава 15.Обработка событий.
Глава 16.Проект: игровая платформа.
Глава 17.Рисование на холсте.
Глава 18.НТТР и формы.
Глава 19.Проект: растровый графический редактор.
Глава 20.Node.js.
Глава 21.Проект: сайт по обмену опытом.
Советы по выполнению упражнений.
Скачать pdf
Ниже можно купить эту книгу по лучшей цене со скидкой с доставкой по всей России. Купить эту книгу
Выразительный JavaScript. Современное веб-программирование (pdf+epub) PDF
Посоветуйте книгу друзьям! Друзьям – скидка 10%, вам – рубли
Эта и ещё 2 книги за 299 ₽
«Выразительный JavaScript» позволит глубоко погрузиться в тему, научиться писать красивый и эффективный код. Вы познакомитесь с синтаксисом, стрелочными и асинхронными функциями, итератором, шаблонными строками и блочной областью видимости.
Марейн Хавербеке – практик. Получайте опыт и изучайте язык на множестве примеров, выполняя упражнения и учебные проекты. Сначала вы познакомитесь со структурой языка JavaScript, управляющими структурами, функциями и структурами данных, затем изучите обработку ошибок и исправление багов, модульность и асинхронное программирование, после чего перейдете к программированию браузеров.
С этой книгой читают
Отзывы 7
Хорошая книга, советую всем, кто интересуется программированием вообще и программированием браузеров в частности. Давно искал такую ясную и полезную книгу. А, главное, – не очень скучную! Рекомендую не только начинающим, но и тем, кому кажется, что они уже «всех собак съели». Будут слегка удивлены, – «что не всех».
Хорошая книга, советую всем, кто интересуется программированием вообще и программированием браузеров в частности. Давно искал такую ясную и полезную книгу. А, главное, – не очень скучную! Рекомендую не только начинающим, но и тем, кому кажется, что они уже «всех собак съели». Будут слегка удивлены, – «что не всех».
Для тех людей которые уже изучали или читали про JavaScript и уже пытаются писать свой код. В этой книги в начале рассказывается, что такое программирование, подразумевается, что человек совсем не знает не только что такое JavaScript, а программирование в целом. Зато после первых двух глав, я толком и не понял, что мы уже начали программировать, получил задание в котором я должен выполнить действия о которых даже и не читал в книге.
Я смог выполнить задания, так как я уже программировал на других языках, но если бы для меня эта книга была бы первая и первый язык программирования, то было бы очень трудно понять для чего и зачем и как это работает. Очень полезно для тех кто уже знает что-то о программировании нет «Воды» как написали бы многие.
Мне не нравится, что автор вместо «Переменные» пишет «Привязки» это сильно путает в голове о чем вообще идет речь.
Для тех людей которые уже изучали или читали про JavaScript и уже пытаются писать свой код. В этой книги в начале рассказывается, что такое программирование, подразумевается, что человек совсем не знает не только что такое JavaScript, а программирование в целом. Зато после первых двух глав, я толком и не понял, что мы уже начали программировать, получил задание в котором я должен выполнить действия о которых даже и не читал в книге.
Я смог выполнить задания, так как я уже программировал на других языках, но если бы для меня эта книга была бы первая и первый язык программирования, то было бы очень трудно понять для чего и зачем и как это работает. Очень полезно для тех кто уже знает что-то о программировании нет «Воды» как написали бы многие.
Мне не нравится, что автор вместо «Переменные» пишет «Привязки» это сильно путает в голове о чем вообще идет речь.
Книга «Выразительный JavaScript. Современное веб-программирование. 3-е издание»
Привет, Хаброжители! Эта книга позволит глубоко погрузиться в тему, научиться писать красивый и эффективный код. Вы познакомитесь с синтаксисом, стрелочными и асинхронными функциями, итератором, шаблонными строками и блочной областью видимости.
Марейн Хавербеке — практик. Получайте опыт и изучайте язык на множестве примеров, выполняя упражнения и учебные проекты. Сначала вы познакомитесь со структурой языка JavaScript, управляющими структурами, функциями и структурами данных, затем изучите обработку ошибок и исправление багов, модульность и асинхронное программирование, после чего перейдете к программированию браузеров.
Обзор этой книги
Эта книга делится на три большие части. В первых 12 главах обсуждается язык JavaScript. Следующие семь глав посвящены браузерам и тому, как JavaScript используется для их программирования. Наконец, две главы посвящены Node.js, еще одной среде для программирования на JavaScript.
На протяжении всей книги вам встретится пять глав проектов, в которых описаны более крупные примеры программ, чтобы вы могли почувствовать вкус настоящего программирования. В порядке их появления мы будем работать над созданием робота доставки, языка программирования, игровой платформы, растрового графического редактора и динамического сайта.
Языковая часть книги начинается с четырех глав, которые познакомят вас с основной структурой языка JavaScript. Вы узнаете, что такое управляющие структуры (такие как ключевое слово while, уже встречавшееся вам во введении), функции (написание собственных строительных блоков) и структуры данных. После этого вы сможете писать простейшие программы. Далее, в главах 5 и 6, описаны способы использования функций и объектов, позволяющие писать более абстрактный код и контролировать его сложность.
После главы первого проекта будет продолжена языковая часть книги — следующие главы посвящены обнаружению и исправлению ошибок, регулярным выражениям (важный инструмент для работы с текстом), модульности (еще одна защита от сложности) и асинхронному программированию (работа с событиями, которые длятся какое-то время). Первую часть книги завершает глава второго проекта.
Во второй части, в главах с 13-й по 19-ю, описаны инструменты, к которым имеет доступ браузер с поддержкой JavaScript. Вы научитесь отображать элементы на экране (главы 14 и 17), реагировать на ввод данных пользователем (глава 15) и обмениваться ими по сети (глава 18). В данной части также содержатся две главы проектов.
После этого в главе 20 описывается Node.js, а в главе 21 создается небольшой сайт с использованием указанного инструмента.
Отрывок. Суммирование с помощью reduce
Еще одна распространенная вещь, которую часто делают с массивами, — вычисление одного значения на их основе. Частный случай этого — уже использованный нами пример с суммированием набора чисел. Другой пример — поиск шрифта, содержащего наибольшее количество символов.
Операция высшего порядка, которая реализует этот шаблон, называется сокращением (иногда ее также называют сверткой). Данная операция строит значение путем многократного получения одного элемента из массива и комбинирования его с текущим значением. При суммировании чисел мы начинаем с нуля и затем прибавляем к сумме каждый следующий элемент.
Параметрами функции reduce, кроме массива, являются комбинирующая функция и начальное значение. Эта функция немного сложнее, чем filter и map, поэтому присмотритесь к ней внимательно:
Стандартный метод для работы с массивами reduce, который, конечно же, соответствует этой функции, имеет дополнительное удобство. Если массив содержит хотя бы один элемент, можно не указывать аргумент start. Метод выберет в качестве начального значения первый элемент массива и начнет сокращение со второго элемента.
Чтобы использовать reduce (дважды) для поиска шрифта с наибольшим количеством символов, мы можем написать нечто вроде этого:
Функция characterCount сокращает диапазоны, назначенные данному шрифту, вычисляя сумму их размеров. Обратите внимание на использование деструктуризации в списке параметров функции сокращения. Затем второй вызов reduce задействует предыдущий результат, чтобы найти самый большой шрифт, многократно сравнивая два шрифта и возвращая больший из них.
Шрифт Han насчитывает более 89 000 символов, назначенных ему в стандарте Unicode, что делает его самой большой системой письма в нашем наборе данных. Han — это шрифт, иногда применяемый для китайских, японских и корейских текстов. В их языках много общих символов, хотя они и пишутся по-разному. Консорциум Unicode (расположенный в США) принял решение рассматривать подобные символы как единую систему записи в целях экономии кодов символов. Это называется объединением Хань и до сих пор очень раздражает некоторых людей.
Компонуемость
Подумаем: как можно было бы переписать предыдущий пример (найти самый большой шрифт) без функций высшего порядка? Следующий код не намного хуже.
Появилось несколько дополнительных привязок, и программа стала на четыре строки длиннее. Но этот код все еще весьма понятен.
Функции высшего порядка начинают быть по-настоящему полезны, когда нужно скомпоновать операции. В качестве примера напишем код, который вычисляет средний год создания шрифтов живых и мертвых языков в наборе данных.
Таким образом, скрипты мертвых языков в Unicode в среднем старше, чем скрипты живых языков.
Это не особенно значимая или удивительная статистика. Но вы, надеюсь, согласитесь, что код, используемый для ее вычисления, нетрудно читать. Это можно представить себе как конвейер: мы начинаем с анализа всех шрифтов, отфильтровываем живые (или мертвые), берем годы их создания, вычисляем среднее значение и округляем результат.
Данное вычисление также можно было бы представить в виде одного большого цикла.
Но в этом коде сложнее понять, что и как вычисляется. А поскольку промежуточные результаты не представлены в виде согласованных значений, пришлось бы проделать гораздо больше работы, чтобы выделить что-нибудь вроде average в отдельную функцию.
С точки зрения того, что на самом деле делает компьютер, эти два подхода также принципиально различаются. Первый создает новые массивы при запуске filter и map, тогда как второй вычисляет только некоторые числа, выполняя меньше работы. Обычно вы можете позволить себе более легко читаемый вариант, но если приходится обрабатывать очень большие массивы и делать это многократно, то менее абстрактный стиль может дать вам дополнительный выигрыш в скорости.
Строки и коды символов
Одно из применений наборов данных — определить, каким шрифтом набран заданный фрагмент текста. Давайте рассмотрим программу, которая это делает.
Вспомним, что для каждого шрифта существует массив диапазонов кодов символов. Поэтому, зная код символа, мы могли бы использовать следующую функцию, чтобы найти соответствующий шрифт (если он есть):
Метод some — это еще одна функция высшего порядка. Он принимает тестовую функцию и сообщает, возвращает ли она true для любого элемента массива.
Но как мы получим коды символов в виде строки?
В главе 1 я упоминал, что в JavaScript строки представляются как последовательности 16-битных чисел. Это так называемые кодовые единицы. Первоначально предполагалось, что в Unicode код символа будет помещаться в таком блоке (что дает чуть больше 65 000 символов). Когда стало ясно, что этого недостаточно, многие стали возражать против необходимости использовать больше памяти для хранения одного символа. Чтобы решить эту проблему, был изобретен формат UTF-16, используемый в строках JavaScript. В нем наиболее распространенные символы занимают одну 16-битную кодовую единицу, а остальные — две кодовые единицы.
Сегодня принято считать, что UTF-16 был плохой идеей. Кажется, он создан, чтобы плодить ошибки. Можно легко написать программу, для которой кодовые единицы и символы — одно и то же. И если для вашего родного языка не используются символы, занимающие две кодовые единицы, эта программа будет нормально работать. Но, как только кто-нибудь попытается использовать такую программу для менее распространенного алфавита, например для китайских иероглифов, она сразу сломается. К счастью, после появления смайликов для кодирования символов стали повсеместно использоваться две кодовые единицы и бремя решения таких проблем распределилось более справедливо.
К сожалению, очевидные операции со строками JavaScript, такие как получение их длины через свойство length и доступ к их содержимому с помощью квадратных скобок, имеют дело только с кодовыми единицами.
Метод JavaScript charCodeAt возвращает не полный код символа, а кодовую единицу. Появившийся позже метод codePointAt возвращает полный символ Unicode. Таким образом, мы могли бы использовать это, чтобы получить символы из строки. Но аргумент, переданный в codePointAt, все еще является индексом в последовательности кодовых единиц. Таким образом, чтобы перебрать все символы в строке, нам все равно нужно решить вопрос о том, занимает символ одну или две кодовые единицы.
В предыдущей главе я упоминал, что цикл for/of можно использовать в том числе и для строк. Подобно codePointAt, этот тип цикла появился в то время, когда программисты четко осознали проблемы UTF-16. Когда вы применяете этот цикл для строки, он дает реальные символы, а не кодовые единицы.
Если у вас есть символ (который представляет собой строку из одной или двух кодовых единиц), то для того, чтобы получить его код, можно использовать codePointAt(0).
Распознавание текста
У нас есть функция characterScript и способ корректного перебора символов в цикле. Следующий шаг — подсчитать количество символов, принадлежащих каждому шрифту. Здесь нам пригодится такая счетная абстракция:
Функция countBy принимает на вход коллекцию (все, что можно перебрать в цикле for/of) и функцию, вычисляющую имя группы для данного элемента. Функция countBy возвращает массив объектов, каждый из которых содержит имя группы и количество найденных для нее элементов.
В этой функции использован еще один метод работы с массивами — findIndex. Данный метод чем-то похож на indexOf, но вместо поиска конкретного значения он находит первое значение, для которого заданная функция возвращает true. В случае если элемент не найден, findIndex, как и indexOf, возвращает –1.
Используя countBy, мы можем написать функцию, сообщающую, какие шрифты были задействованы в данном фрагменте текста.
Функция сначала подсчитывает символы по имени шрифта, используя characterScript, чтобы назначить им имя, и возвращает строку «none» для символов, которые не относятся ни к какому шрифту. Вызов filter удаляет запись «none» из полученного массива, поскольку эти символы нас не интересуют.
Чтобы иметь возможность вычислять процентные соотношения, нам сначала нужно получить общее количество символов, принадлежащих шрифту, которое мы можем вычислить с помощью метода reduce. Если такие символы не найдены, то функция возвращает конкретную строку. В противном случае она преобразует результаты подсчета в удобно читаемые строки с помощью map, а затем объединяет их с помощью join.
Резюме
Возможность передавать функциональные значения другим функциям является очень полезным аспектом JavaScript. Это позволяет создавать функции, которые моделируют вычисления с «пробелами». Впоследствии при вызове таких функций в коде данные «пробелы» заполняются функциональными значениями.
Для массивов существует ряд полезных методов высшего порядка. Метод forEach можно использовать для циклического перебора элементов массива. Метод filter возвращает новый массив, содержащий только элементы, удовлетворяющие условию предикативной функции. Преобразование массива посредством выполнения функции для каждого элемента выполняется с помощью map. Чтобы объединить все элементы массива в одно значение, можно использовать reduce. Метод some проверяет, соответствует ли какой-либо элемент заданной предикативной функции. Наконец, метод findIndex находит позицию первого элемента, который соответствует предикату.
Для Хаброжителей скидка 25% по купону — JavaScript
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Выразительный JavaScript: Введение
Содержание
Мы обнаружили два эффективных способа уменьшить коммуникационный разрыв между нами – водянистыми биологическими организмами, у которых есть талант к социальным связям и пространным рассуждениям, и компьютерами – бесчувственными манипуляторами, работающими с бессмысленными данными. Первый – обратиться к нашему ощущению физического мира, и строить интерфейсы, имитирующие его, чтобы мы могли при помощи пальцев манипулировать формами на экране. Для простого взаимодействия с компьютером это неплохо подходит.
Но мы не нашли хороший способ передавать компьютеру при помощи перемещений и нажатий мышью те вещи, которые дизайнер интерфейса не предусмотрел. Для того, чтобы взаимодействовать с компьютером на более сложных уровнях, например задавать ему произвольные задачи на выполнение, лучше подходит наш талант к общению: мы обучаем компьютер языку.
Человеческие языки позволяют комбинировать слова великим множеством способов, так, что мы можем сказать очень много разных вещей. Компьютерные языки устроены примерно так же, хотя и менее гибки грамматически.
За последние 20 лет работа с компьютером стала очень распространённым явлением, и интерфейсы, построенные на языке (а когда-то это был единственный способ общения с компьютером) почти вытеснены графическими. Но они всё ещё есть – если вы знаете, где их искать. Один из таких языков, JavaScript, встроен почти в любой веб-браузер, и потому доступен почти на каждом вычислительном устройстве.
Эта книга ставит целью познакомить вас с этим языком достаточно для того, чтобы вы могли заставить компьютер делать то, что вам нужно.
О программировании
Я не просвещаю тех, кто не жаждет учиться, и не побуждаю тех, кто не хочет искать ответы самостоятельно. Если я покажу один угол квадрата, и они не приходят ко мне с остальными тремя – мне не нужно давать повторных объяснений.
Кроме объяснения JavaScript я также хочу объяснить основные принципы программирования. Как выясняется, программировать тяжело. Обычно базовые принципы просты и понятны. Но программы, построенные на этих принципах, становятся сложными настолько, что вводят свои собственные правила и уровни сложности. Вы строите свой собственный лабиринт, и можете в нём потеряться.
Возможно, временами чтение будет разочаровывать вас. Если вы новичок в программировании, вам нужно будет много чего переварить. Много материала будет скомбинировано таким образом, что вам нужно будет установить новые связи между его частями.
Вы сами должны обосновать необходимость этих усилий. Если вам тяжело продираться через книгу, не нужно думать о себе плохо. С вами всё в порядке – вам нужно просто продолжать движение. Сделайте перерыв, вернитесь назад – и всегда удостоверяйтесь, что вы прочли и поняли примеры программ. Обучение – это сложная работа, но раз вы что-то выучили, оно уже принадлежит вам, и облегчает дальнейшие шаги.
Программист создаёт вселенные, за которые он один в ответе. В компьютерных программах могут быть созданы вселенные практически неограниченной сложности.
Джозеф Вайзенбаум, «Сила компьютеров и Разум людей»
Программа – сложное понятие. Это кусок текста, набранный программистом, это направляющая сила, заставляющая компьютер что-то делать, это данные в памяти компьютера, и при этом она контролирует работу с этой же самой памятью. Аналогии, которые пытаются сравнивать программы со знакомыми нам объектами обычно не справляются с этим. Одна более-менее подходящая – аналогия с машиной. Множество отдельных частей составляют одно целое, и чтобы заставить её работать, нам нужно представлять себе способы, которыми эти части взаимодействуют и что они привносят в работу целой машины.
Компьютер – это машина, которая устроена так, чтобы содержать в себе эти нематериальные машинки. Компьютеры сами по себе могут выполнять только простые действия. Польза их в том, что они могут делать это очень быстро. Программа может очень хитрым образом комбинировать эти действия так, чтобы в результате выполнялись очень сложные действия.
Для некоторых из нас программирование – это увлекательная игра. Программа – это мысленная конструкция. Ничего не стоит её построить, она ничего не весит, и она легко вырастает под нашими пальцами.
Если не быть осторожным, размер и сложность выходят из-под контроля, запутывая даже того, кто её пишет. Это основная проблема программирования: сохранять контроль над программами. Когда программа работает – это прекрасно. Искусство программирования – это умение контролировать сложность. Большая программа находится под контролем, и выполнена просто в своей сложности.
Многие программисты верят, что этой сложностью лучше всего управлять, используя в программах небольшой набор хорошо известных техник. Они описали строгие правила («наилучшие практики») того, какую форму программы должны иметь. И самые ревностные среди них считают тех, кто отклоняется от этих практик, плохими программистами.
Что за враждебность по отношению к богатству программирования – попытки принизить его до чего-то прямолинейного и предсказуемого, наложить табу на всякие странные и прекрасные программы! Ландшафт техник программирования огромен, увлекателен своим разнообразием, и до сих пор изучен мало. Это опасное путешествие, заманивающее и запутывающее неопытного программиста, но это всего лишь означает, что вы должны следовать этим путём осторожно и думать головой. По мере обучения вам всегда будут встречаться новые задачи и новые неизведанные территории. Программисты, не изучающие новое, стагнируют, забывают свою радость, их работа наскучивает им.
Почему язык имеет значение
В начале, при зарождении компьютерных дисциплин, не было языков программирования. Программы выглядели так:
Это программа, складывающая числа от 1 до 10, и выводящая результат (1 + 2 +… + 10 = 55). Она может выполняться на очень простой гипотетической машине. Для программирования первых компьютеров было необходимо устанавливать большие массивы переключателей в нужные позиции, или пробивать дырки в перфокартах и скармливать их компьютеру. Можете представить, какая это была утомительная, подверженная ошибкам процедура. Написание даже простых программ требовало большого ума и дисциплины. Сложные программы были практически немыслимы.
Конечно, ручной ввод этих мистических диаграмм бит (нулей и единиц) давал программисту возможность ощутить себя волшебником. И это чего-то стоило в смысле удовлетворения работой.
Каждая строка указанной программы содержит одну инструкцию. На обычном языке их можно описать так:
Этот вариант легче прочесть, чем кучу бит, но он всё равно не очень удобен. Использование имён вместо номеров инструкций и ячеек памяти может улучшить понимание.
Вот теперь уже не так сложно понять, как работает программа. Справитесь? Первые две строки назначают двум областям памяти начальные значения. total будет использоваться для подсчёта результата вычисления, а count будет следить за числом, с которым мы работаем в данный момент. Строчки, использующие ‘compare’, наверно, самые странные. Программе нужно понять, не равно ли count 11, чтобы прекратить подсчёт. Так как наша воображаемая машина довольно примитивна, она может только выполнить проверку на равенство переменной нулю, и принять решение о том, надо ли перепрыгнуть на другую строку. Поэтому она использует область памяти под названием ‘compare’, чтобы подсчитать значение count – 11 и принять решение на основании этого значения. Следующее две строки добавляют значение count в счетчик результата и увеличивают count на 1 каждый раз, когда программа решает, что ещё не достигла значения 11.
Вот та же программа на JavaScript:
Еще несколько улучшений. Главное – нет необходимости вручную обозначать переходы между строками. Конструкция языка while делает это сама. Она продолжает вычислять блок, заключённый в фигурные скобки, пока условие выполняется (count