Привет, меня зовут Сергей. Уже год я работаю верстальщиком в хостинг-провайдере 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», можно открыть новые занимательные факты об этом языке программирования.
Читать эту книгу или нет — выбирать вам. Могу лишь сказать, что каждый, кто интересуется веб-разработкой, найдёт в ней для себя что-то новое и занятное.