Рецензия на книгу Дугласа Крокфорда «Как устроен JavaScript»
Привет, меня зовут Сергей. Уже год я работаю верстальщиком в хостинг-провайдере REG.RU и всё это время постепенно знакомлюсь с JavaScript. Чтобы узнать что-то новое об этом языке программирования, читаю такие источники, как MDN (Mozilla Developer Network), разные статьи в Medium, Learn.javascript.ru и смотрю видео на YouTube. Мне стало интересно, как же работает JavaScript изнутри, поэтому решил прочитать «Как устроен JavaScript» Дугласа Крокфорда.
Об авторе и книге
Дуглас Крокфорд — известный американский программист, создатель текстового формата обмена данными JSON (JavaScript Object Notation). Также Крокфорд постоянно участвует в развитии языка JavaScript и является автором таких инструментов, как статический анализатор кода JSLint и минификатор JSMin.
Дуглас Крокфорд написал несколько книг по языку JavaScript. Одна из них — «Как работает JavaScript» («How JavaScript Works»).
О чём книга и кому стоит её читать?
Для начала немного расскажу о содержании книги. Автор пишет о самом языке JavaScript, а не о каких-то других более утончённых его аспектах.
«Здесь не рассматриваются механизмы обработки кода JavaScript или виртуальные машины. Книга — о самом языке и о том, что должен знать каждый программист. В ней я попробую сделать радикальную переоценку JavaScript, того, как он работает, как его можно усовершенствовать и как лучше использовать. Речь идет о том, как думать о JavaScript и как думать в JavaScript».
В начале книги Крокфорд предупреждает читателя, что произведение подходит не новичкам, а специалистам, которые уже давно знакомы с JavaScript. Автор рассматривает основы языка с точки зрения их правильного использования в проектах, влияния на безопасность программы, написания практичного и понятного кода, сравнивает методы работы JavaScript с другими языками программирования.
«Эта книга написана для людей, имеющих определенный опыт работы с JаvаSсгiрt и желающих приобрести более чёткое и глубокое понимание того, как этот язык работает и как добиться от него наибольшей отдачи. Она также подойдет опытным программистам, желающим освоить еще один язык.
Издание не для начинающих. Надеюсь, что когда-нибудь напишу книгу и для них. Но эта им не подойдет. Её не назовешь легким чтивом. Беглый просмотр вам ничего не даст».
Крокфорд рассказывает о создании текстового формата обмена данными JSON. Читатель познакомится с мнением автора о том, почему именно те или иные методы и механизмы он вложил в этот формат.
Дуглас Крокфорд не обходит и отрицательные стороны JavaScript. В книге он размышляет, каким должен быть следующий язык программирования, который придёт на смену JavaScript, и какие сильные стороны ему стоит унаследовать от своего предшественника. Автор рассматривает, как работает транслируемый язык NEO, который, как считает Крокфорд, должен помочь перейти к новому языку, решив проблемы, имеющиеся в JavaScript. Также Дуглас Крокфорд рассказывает о других занимательных моментах, касающихся JavaScript.
Интересные мысли из книги
Читая книгу, я выделил несколько интересных для себя тезисов.
Именование переменных и функций
Автор считает, что использование символа подчеркивания ( _ ) в имени переменной для указания её закрытости говорит о некомпетентности программиста.
«Символ подчеркивания ( _ ) в начале или в конце имени иногда предназначается для указания общедоступного свойства или глобальной переменной, которая была бы закрытой, если бы программа была написана правильно. Следовательно, использование символа подчеркивания — признак некомпетентности программиста».
Крокфорд утверждает, что все имена должны начинаться с буквы в нижнем регистре. Это основано на существующей проблеме с оператором new : если он стоит перед именем функции, то она вызывается как функция-конструктор. Поскольку обычная функция и конструктор выглядят одинаково, это может запутать программиста. Поэтому автор советует прийти к единому соглашению по именованию функций-конструкторов: «Все имена функций-конструкторов должны начинаться с прописной буквы, и никакое другое имя не должно начинаться с буквы в верхнем регистре».
Далее Дуглас Крокфорд предлагает вообще отказаться от оператора new , объясняя это тем, что можно будет не использовать слова, которые начинаются с буквы в верхнем регистре.
Полезные методы
Из книги я узнал несколько полезных стандартных методов, которые наверняка пригодятся на практике.
- метод Number.isNaN() позволяет протестировать, равно ли значение NaN или нет, и является более надёжным, чем функция isNan() , так как не преобразует параметр в число;
- когда оператору typeof предлагается определить тип массива, то он возвращает «object». Дуглас Крокфорд советует использовать функцию Array.isArray() , чтобы точно определить принадлежность значения к массиву;
- также я узнал о работе некоторых методов работы с массивами, их достоинствах и недостатках. Для себя отметил их классификацию «чистый — нечистый», разделяющую методы на не изменяющие и изменяющие исходные данные;
- Дуглас Крокфорд, рассказывая об объектах, говорит, что для создания объекта использует Object.create(null) . Автор подкрепляет свой выбор тем, что этот метод создаёт объект, который не имеет наследственности;
- пожалуй, один из самых интересных моментов для меня — описание метода Object.freeze() . Метод получает объект и замораживает его, делая неизменяемым.
«К счастью, Object.create(null) создаёт объект, не обремененный наследственностью. Не возникает никакой путаницы ни с унаследованными свойствами, ни с непреднамеренным наследованием. В объекте нет ничего, кроме того, что в него помещено явным образом. Я сейчас пользуюсь Object.create(null) весьма часто».
Дуглас Крокфорд отмечает, что это положительно сказывается на безопасности и производительности проекта. Но автор предупреждает, что заморозка работает только на объектах верхнего уровня.
This
Привязка this довольно сложная в использовании, но Крокфорду удалось подробно и занимательно объяснить, как она работает. Автор рассказывает, каким образом она может повлиять на безопасность и надёжность проекта, и предлагает отказаться от её использования.
«Моё решение этой проблемы — полный запрет this. Аргументы: проблематичность и ненужность этой привязки. Если мы уберем this из языка, его полноценность по Тьюрингу не пострадает. Поэтому я начал программировать в диалекте, свободном от this, чтобы выяснить степень трудностей, связанных с отказом от неё.
Как же я удивился тому, что ситуация не усложнилась, а упростилась и мои программы стали меньше и качественнее».
Чистота функций
Любителей чистого кода порадует глава «Как работает чистота», где Крокфорд говорит о преимуществах чистых функций. Он советует, как добиться чистоты, и делает небольшой обзор всех компонентов языка, от которых нужно отказаться. К примеру, автор предлагает не использовать операторы присваивания, в том числе инструкции var и let , оставив только const . Оператор const позволяет инициализировать константу.
Оптимизация программ
В главе «Как работает оптимизация» ищите практические советы. Для себя я отметил, что при оптимизации нужно выбирать именно те функции, из которых получается понятная и легко обслуживаемая программа. Также я выделил принцип, которого автор советует придерживаться программистам: «Измерить, затем вырезать, затем ещё раз измерить».
Далее Дуглас Крокфорд подробнее раскрывает принцип: «Перед оптимизацией нужно измерить производительность оптимизируемого кода. Это делается, чтобы установить базовый уровень и показать, что код замедляет всю программу. Если код погоды не делает, нужно искать в другом месте. Затем проводится тщательная оптимизация кода. После чего снова выполняются измерения. Если изменения не позволяют существенно превзойти базовый уровень, они отклоняются. Они не позволили добиться ожидаемого улучшения, а сбои мы не проверяем».
Заключение
Это лишь часть интересных и полезных моментов, которые я для себя выделил. Уверен, что если перечитать «Как устроен JavaScript» , можно открыть новые занимательные факты об этом языке программирования.
Читать эту книгу или нет — выбирать вам. Могу лишь сказать, что каждый, кто интересуется веб-разработкой, найдёт в ней для себя что-то новое и занятное.
Книга «Как устроен JavaScript»

Большинство языков программирования выросли из древней парадигмы, порожденной еще во времена Фортрана. Гуру JavaScript Дуглас Крокфорд выкорчевывает эти засохшие корни, позволяя нам задуматься над будущим программирования, перейдя на новый уровень понимания требований к Следующему Языку (The Next Language).
Автор начинает с основ: имен, чисел, логических значений, символов и другой базовой информации. Вы узнаете не только о проблемах и трудностях работы с типами в JavaScript, но и о том, как их можно обойти. Затем вы приступите к знакомству со структурами данных и функции, чтобы разобраться с механизмами, лежащими в их основе, и научитесь использовать функции высшего порядка и объектно-ориентированный стиль программирования без классов.
Отрывок
Как работает код без классов
И думаешь, что ты умен вне всяких классов и свободен.
Джон Леннон (John Lennon)
Одной из ключевых идей в разработке объектно-ориентированного программирования была модель обмена данными между частями программы. Имя метода и его аргументы нужно представлять в виде сообщений. Вызов метода посылает объекту сообщение. Каждый объект характеризуется собственным поведением, которое проявляется при получении конкретных сообщений. Отправитель полагает, что получатель знает, что ему делать с сообщением.
Одной из дополнительных выгод является полиморфизм. Каждый объект, распознавший конкретное сообщение, имеет право на его получение. Что происходит потом, зависит от специализации объекта. И это весьма продуктивная мысль.
К сожалению, мы стали отвлекаться на наследование — весьма эффективную схему повторного использования кода. Его важность связана с возможностью уменьшить трудозатраты при разработке программы. Наследование выстраивается на схожем замысле, за исключением некоторых нюансов. Можно сказать, что некоторый объект или класс объектов подобен какому-то другому объекту или классу объектов, но имеет некоторые важные отличия. В простой ситуации все работает замечательно. Следует напомнить, что современное ООП началось со Smalltalk — языка программирования для детей. По мере усложнения ситуации наследование становится проблематичным. Оно порождает сильное сцепление классов. Изменение одного класса может вызвать сбой в тех классах, которые от него зависят. Модули из классов получаются просто никудышными.
Кроме того, мы наблюдаем повышенное внимание к свойствам, а не к объектам. Особое внимание уделяется методам получения (get-методам) и присваивания (set-методам) значений каждому отдельно взятому свойству, а в еще менее удачных проектах свойства являются открытыми и могут быть изменены без ведома объекта. Вполне возможно ввести в обиход более удачный проект, где свойства скрыты, а методы обрабатывают транзакции, не занимаясь только лишь изменением свойств. Но такой подход применяется нечасто.
Кроме того, существует слишком сильная зависимость от типов. Типы стали особенностью Фортрана и более поздних языков, так как были удобны создателям компилятора. С тех времен мифология вокруг типов разрослась, обзаведясь экстравагантными заявлениями о том, что типы защищают программу от ошибок. Несмотря на преданность типам, ошибки не ушли из повседневной практики.
Типы вызывают уважение, их хвалят за раннее обнаружение просчетов на стадии компиляции. Чем раньше будет обнаружена оплошность, тем меньших затрат потребует ее ликвидация. Но при надлежащем тестировании программы все эти просчеты обнаруживаются очень быстро. Поэтому ошибки идентификации типов относятся к категории малозатратных.
Типы не виноваты в появлении труднообнаруживаемых и дорогостоящих ошибок. Их вины нет и в возникновении проблем, вызываемых такими ошибками и требующих каких-то уловок. Типы могут подтолкнуть нас к использованию малопонятных, запутанных и сомнительных методов программирования.
Типы похожи на диету для похудания. Диету не обвиняют в возвращении и увеличении веса. Ее также не считают причиной страданий или вызванных ею проблем со здоровьем. Диеты вселяют надежду, что вес придет в здоровую норму и мы продолжим есть нездоровую пищу.
Классическое наследование позволяет думать, что мы создаем качественные программы, в то время как мы допускаем все больше ошибок и применяем все больше неработоспособных наследований. Если игнорировать негативные проявления, типы представляются крупной победой. Преимущества налицо. Но если присмотреться к типам более пристально, можно заметить, что затраты превышают выгоду.
Конструктор
В главе 13 мы работали с фабриками — функциями, возвращающими функции. Что-то похожее теперь можем сделать с конструкторами — функциями, возвращающими объекты, которые содержат функции.
Начнем с создания counter_constructor, похожего на генератор counter. У него два метода, up и down:
function counter_constructor() < let counter = 0; function up() < counter += 1; return counter; >function down() < counter -= 1; return counter; >return Object.freeze(< up, down >); >
Возвращаемый объект заморожен. Он не может быть испорчен или поврежден. У объекта есть состояние. Переменная counter — закрытое свойство объекта. Обратиться к ней можно только через методы. И нам не нужно использовать this.
Это весьма важное обстоятельство. Интерфейсом объекта являются исключительно методы. У него очень крепкая оболочка. Мы получаем наилучшую инкапсуляцию. Прямого доступа к данным нет. Это весьма качественная модульная конструкция.
Конструктор — это функция, возвращающая объект. Параметры и переменные конструктора становятся закрытыми свойствами объекта. В нем нет открытых свойств, состоящих из данных. Внутренние функции становятся методами объекта. Они превращают свойства в закрытые. Методы, попадающие в замороженный объект, являются открытыми.
В методах должны реализовываться транзакции. Предположим, к примеру, что у нас есть объект person. Может потребоваться изменить адрес того лица, чьи данные в нем хранятся. Для этого не нужен отдельный набор функций для изменения каждого отдельного элемента адреса. Нужен один метод, получающий объектный литерал, способный дать описание всех частей адреса, нуждающихся в изменении.
Одна из блестящих идей в JavaScript — объектный литерал. Это приятный и выразительный синтаксис для кластеризации информации. Создавая методы, потребляющие и создающие объекты данных, можно сократить количество методов, повышая тем самым целостность объекта.
Получается, у нас есть два типа объектов.
- Жесткие объекты содержат только методы. Эти объекты защищают целостность данных, содержащихся в замыкании. Они обеспечивают нас полиморфизмом и инкапсуляцией.
- Мягкие объекты данных содержат только данные. Поведение у них отсутствует. Это просто удобная коллекция, с которой могут работать функции.
Если жесткий объект должен быть преобразован в строку, нужно включить метод toJSON. Иначе JSON.stringify увидит его как пустой объект, проигнорировав методы и скрытые данные (см. главу 22).
Параметры конструктора
Однажды я создал конструктор, получающий десять аргументов. Им было очень сложно пользоваться, поскольку никто не мог запомнить порядок следования аргументов. Позже было подмечено, что никто не использует второй аргумент, я мне захотелось убрать его из списка параметров, но это сломало бы весь уже разработанный код.
Будь я предусмотрительнее, у меня был бы конструктор, получающий в качестве параметра один объект. Обычно он берется из объектного литерала, но может поступать и из других источников, например из JSON-содержимого.
Это дало бы множество преимуществ.
- Ключевые строки придают коду задокументированный вид. Код легче читается, поскольку он сам сообщает вам, что представляет собой каждый аргумент вызывающей стороны.
- Аргументы могут располагаться в любом порядке.
- В будущем можно добавлять новые аргументы, не повреждая существующий код.
- Неактуальные параметры можно игнорировать.
function my_little_constructor(spec) < let < name, mana_cost, colors, type, supertypes, types, subtypes, text, flavor, power, toughness, loyalty, timeshifted, hand, life >= spec;
Этот код создает и инициализирует 15 закрытых переменных, используя свойства с такими же именами из spec. Если в spec нет соответствующего свойства, происходит инициализация новой переменной, которой присваивается значение undefined. Это позволяет заполнять все пропущенное значениями по умолчанию.
Композиция
Яркая выразительность и эффективность JavaScript позволяют создавать программы в классической парадигме, хотя этот язык и не относится к классическим. JavaScript позволяет также вносить улучшения. Мы можем работать с функциональной композицией. Итак, вместо добавления чего-то в качестве исключения можно получить понемногу того и этого. Конструктор имеет следующий общий вид:
function my_little_constructor(spec) < let = spec; const повторно_используемый = other_constructor(spec); const метод = function () < // могут применяться spec, компонент, повторно_используемый, метод >; return Object.freeze(< метод, повторно_используемый.полезный >); >
Ваш конструктор способен вызвать столько других конструкторов, сколько нужно для получения доступа к управлению состоянием и обеспечиваемому ими поведению. Ему даже можно передать точно такой же объект spec. Документируя spec-параметры, мы перечисляем свойства, нужные my_little_constructor, и свойства, необходимые другим конструкторам.
Иногда можно просто добавить полученные методы к замороженному объекту. В иных случаях у нас есть новые методы, вызывающие полученные методы. Тем самым достигается повторное использование кода, похожее на наследование, но без сильного сцепления. Вызов функции является исходной схемой повторного применения кода, и ничего лучше еще не придумано.
Размер
При таком подходе к конструированию объекта задействуется больше памяти, чем при использовании прототипов, поскольку каждый жесткий объект содержит все методы объекта, а прототипный объект содержит ссылку на прототип, содержащий методы. Существенна ли разница в потреблении памяти? Соизмеряя разницу с последними достижениями в повышении объема памяти, можно сказать: нет. Мы привыкли считать память в килобайтах. А теперь считаем ее в гигабайтах. На этом фоне разница совершенно не чувствуется.
Разницу можно сократить, улучшив модульность. Акцент на транзакциях, а не на свойствах позволяет уменьшить количество методов, а заодно улучшить связанность.
Классическая модель характеризуется однообразием. Каждый объект должен быть экземпляром класса. JavaScript снимает эти ограничения. Не все объекты нуждаются в соблюдении столь жестких правил.
Например, я полагаю, что нет никакого смысла в том, чтобы точки обязательно были жесткими объектами с методами. Точка может быть простым контейнером для двух или трех чисел. Точки передаются функциям, которые способны выполнять проекцию, или интерполяцию, или еще что-то, что можно делать с точками. Это может оказаться гораздо продуктивнее, чем создание подклассов точек, придающих им особое поведение. Пусть работают функции.
Для Хаброжителей скидка 25% по купону — JavaScript
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Как устроен JavaScript
Цена на сайте может отличаться от цены в магазинах сети. Внешний вид книги может отличаться от изображения на сайте.
Цена на сайте может отличаться от цены в магазинах сети. Внешний вид книги может отличаться от изображения на сайте.
Поделиться с друзьями
Ссылка скопирована
Игра в программирование без правил и ограничений. .Большинство языков программирования выросли из древней парадигмы, порожденной еще во времена Фортрана. Гуру Javascript — Дуглас Крокфорд — выкорчевывает эти засохшие корни, позволяя нам задуматься над будущим программирования, перейдя на новый уровень понимания требований к Следующему Языку (The Next Language). .Автор начинает с основ: имен, чисел, логических значений, символов и другой базовой информации. Вы узнаете не только о проблемах и трудностях работы с типами в JavaScript, но и о том как их можно обойти. Затем вы приступите к знакомству со структурами данных и функции, чтобы разобраться с механизмами, лежащими в их основе, и научитесь использовать функции высшего порядка и объектно-ориентированный стиль программирования без классов. .
Характеристики
Игра в программирование без правил и ограничений. .Большинство языков программирования выросли из древней парадигмы, порожденной еще во времена Фортрана. Гуру Javascript — Дуглас Крокфорд — выкорчевывает эти засохшие корни, позволяя нам задуматься над будущим программирования, перейдя на новый уровень понимания требований к Следующему Языку (The Next Language). .Автор начинает с основ: имен, чисел, логических значений, символов и другой базовой информации. Вы узнаете не только о проблемах и трудностях работы с типами в JavaScript, но и о том как их можно обойти. Затем вы приступите к знакомству со структурами данных и функции, чтобы разобраться с механизмами, лежащими в их основе, и научитесь использовать функции высшего порядка и объектно-ориентированный стиль программирования без классов. .
Дуглас Крокфорд: Как устроен JavaScript

Игра в программирование без правил и ограничений.
Большинство языков программирования выросли из древней парадигмы, порожденной еще во времена Фортрана. Гуру Javascript — Дуглас Крокфорд — выкорчевывает эти засохшие корни, позволяя нам задуматься над будущим программирования, перейдя на новый уровень понимания требований к Следующему Языку (The Next Language).
Автор начинает с основ: имен, чисел, логических значений, символов и другой базовой информации. Вы узнаете не только о проблемах и трудностях работы с типами в JavaScript, но и о том как их можно обойти. Затем вы приступите к знакомству со структурами данных и функции, чтобы разобраться с механизмами, лежащими в их основе, и научитесь использовать функции высшего порядка и объектно-ориентированный стиль программирования без классов.
Иллюстрации к книге Дуглас Крокфорд — Как устроен JavaScript
Рецензии на книгу «Как устроен JavaScript»
- Покупатели 2
Мы всегда рады честным, конструктивным рецензиям. Лабиринт приветствует дружелюбную дискуссию ценителей и не приветствует перепалки и оскорбления.
(рецензий 14 / оценок +60 )
Понравилось? Да
Весьма оригинальная книга для книжной JavaScript арены. Субъективный взгляд на то как работать с этим языком от одного из самых продвинутых его знатоков. JS хорош тем, что на нем можно писать в очень разных стилях, есть множество подходов, которые работают тут, в отличие от более узконаправленных языков. И Дуглас Крокфорд рассказывает о своем видении языка и работы с ним, без особой любви к JS и сюсюканья с ним, но довольно субъективно, тем не менее. Приводит много своих личных.
Весьма оригинальная книга для книжной JavaScript арены. Субъективный взгляд на то как работать с этим языком от одного из самых продвинутых его знатоков. JS хорош тем, что на нем можно писать в очень разных стилях, есть множество подходов, которые работают тут, в отличие от более узконаправленных языков. И Дуглас Крокфорд рассказывает о своем видении языка и работы с ним, без особой любви к JS и сюсюканья с ним, но довольно субъективно, тем не менее. Приводит много своих личных «трюков», которые мне понравились, многое не знал, хотя пишу веб-приложения довольно давно.
В общем, почитать стоит, если вы мало-мальски продвинутый специалист — чтобы трезво оценить со своей колокольни, что вам нужно, что нет, что подойдет к вашему стилю и привычкам, что не очень.
Мне зашло, буду перечитывать) Скрыть
