JavaScript.

  Script - одно из значений этого английского слова - сценарий. Получается, что язык программирования JavaScript предназначен для формализации некого сценария поведения Web-страницы в различных ситуациях, которые могут быть предусмотрены разработчиком.
  В принципе в Web-дизайне можно выделить три функциональных блока:
  • Размещение контента - HTML.
  • Оформление контента - CSS.
  • Поведение контента - программные скрипты (в частности на языке JavaScript).
  Такое разделение, конечно же, довольно условно, поскольку все эти три блока тесно связаны между собой, и добиться их оптимального взаимодействия - это основная задача Web-разработчика.
  В специальной литературе достаточно много написано о том, как по стандарту на самом деле называется язык программирования, за которым исторически закрепилось название JavaScript, какое отношение он имеет к Java, и как складывалась его история. Что есть, то есть, но для всех разработчиков, он был, есть и будет языком JavaScript. Поэтому он так и называется в этом справочнике.
  Итак JavaScript - объектно ориентированный язык программирования.
  Программы JavaScript, как правило, выполняются на устройстве пользователя Web-страницы (клиенте). Программный код JavaScript интерпретируется браузером, следовательно, для браузера и пишется со всеми вытекающими из этого нюансами.
  Независимая от браузера среда выполнения кода JavaScript, такая как, например, - Node.js, потребует наличия дополнительного программного обеспечения, которого, в отличие от браузера, может не быть на клиентском устройстве. Поэтому соответствующие приложения предназначены преимущественно для создания Web-серверов. Кроме того использование клиентских приложений того же Node.js для Web-дизайна, в отличие от браузерного JavaScript, функционально мало чем отличается от использования приложений C++ или Java.

  То есть программист JavaScript, по существу, пишет сценарий работы браузера с соответствующей Web-страницей, а, следовательно, с элементами тегов и таблицами стилей, позволяя динамически изменять эти компоненты, через предоставленные браузером интерфейсы (API), в зависимости от различных условий, предусмотренных сценарием.

  Все API к элементам текущих документов Web-страницы, которые предоставляет браузер программе JavaScript, доступны через так называемую объектную модель документа - DOM, построенную браузером для этой Web-страницы и поддерживаемую браузером во всё время существования этой Web-страницы на устройстве пользователя.

  Сценарию на JavaScript доступны также API к компонентам самого браузера такие, как например, окно браузера, или файлы cookes, а также различные API развивающихся технологий Web-дизайна, поддерживаемых браузерами.

  Важнейшим свойством JavaScript является возможность привязки рабочего функционала программы к различным формализованным событиям, возникающим в процессе общения пользователя с Web-страницей. Событийный механизм также реализует и поддерживает браузер

  В целом JavaScript, как и любой другой язык программирования, имеет стандартный функционал позволяющий использовать простые переменные, массивы и функции, строить выражения и циклы.
  Также, кроме API предоставляемых браузером, в JavaScript стандартизированы встроенные объекты, которые существенно расширяют функционал языка.
  В "старом" JavaScript не было функционала работы с файлами и базами данных на клиентском устройстве. Это объяснялось соображениями безопасности. Однако, с распространением Web в локальных сетях, которые могут администрироваться централизованно, такой функционал оказался не лишним, поэтому он появился и развивается.
  (Но, как к возможности использования Web-сайтом своего жесткого диска относится стандартный пользователь клиента, и знает ли он вообще об этом, - это большой вопрос.)
  Объектная модель JavaScript не совсем канонична, она не имеет классов. Считается, что объект это и есть класс, а конкретным его воплощением является экземпляр объекта, который может быть предоставлен непосредственно браузером или функционалом самого языка JavaScript.
  Очевидно это объясняется историческими причинами, а также основой интерфейса DOM, объекты которой всегда соответствуют совершенно конкретному HTML-документу.
  Стандарт ECMAScript 6 (ES6) предложил перейти в JavaScript к канонической объектной модели. Этим стандартом предписан механизм реализации классов объектов. Объясняется это трудностями в освоении JavaScript разработчиками, которые уже программировали на других языках. Этот довод трудно принять во внимание, если учесть, что традиционную модель, в силу исторических причин, отменить невозможно, а одновременное существование двух моделей вряд ли приведёт к тому, что язык станет легче в освоении.
  Скорее всего, переход в JavaScript к канонической объектной модели лоббируется теми, кто продвигает не браузерный JavaScript (например Node.js). Однако браузерам также пригодится следовать этому стандарту.
  На сегодняшний день в мире Web-разработки существует почти официальное разделение разработчиков на категории frontend и backend.
  • frontend это те, кто делает пользовательский интерфейс для клиентского устройства.
  • backend разработчики обеспечивают серверную часть функционала Web-сайта.
  К сожалению, в среде backend разработчиков укоренилось мнение, что JavaScript это некий "игрушечный" язык программирования, функционал которого не способен внести многого в Web-разработку.
  Однако это совсем не так. Функционал JavaScript нельзя рассматривать вне возможностей, которые предоставляются ему браузером в виде DOM и многих других API.
  Эти возможности делают JavaScript уникальным инструментом разработки пользовательского Web-интерфейса на основе HTML и браузера. Да и не только Web-интерфейса.

  Вообще говоря, необходимость в backend по существу диктуется одной единственной причиной. Эта причина - потребность в едином хранилище данных на сервере для всех потенциальных пользователей Web-сайта.
  А главным инструментом backend разработчика является СУБД, так как у frontend-а исторически не было хорошего функционала для формирования запросов к базе данных и получения ответной информации из неё.
  До сравнительно недавнего времени frontend, чтобы обратиться к серверной базе данных, формировал HTTP-запросы и отправлял их на сервер с помощью специальных элементов интерфейса. Сервер должен был запустить серверный скрипт backend-а, который делал соответствующий запрос в базе данных, получал ответ и отправлял его frontend-у.
  То есть серверным скриптам (например, PHP-скриптам) пришлось научиться работать с СУБД. А, поскольку, тот же PHP изначально был предназначен совсем для других целей, то ответить он мог только HTML-кодом.
  Этот код не предназначался для скрипта JavaScript на клиентском устройстве, а сразу же интерпретировался браузером. И это создавало, кроме всего прочего, какие-то (чисто умозрительные) ограничения для раскрытия полноценного функционала JavaScript.

  Однако появились технология AJAX (Asynchronous JavaScript and XML) и объект XMLHTTPRequest, который стал доступен скрипту JavaScript.
  И скрипт JavaScript смог формировать клиентский запрос, и, по цепочке,

        серверный скрипт -- сервер --- браузер --- клиентский скрипт

смог получать ответ в формате XML или JSON, который проходил через браузер, минуя его интерпретацию.

  Недавно же в браузерных API был стандартизирован метод fetch, функционал которого подобен функционалу XMLHTTPRequest. Но механизм метода fetch построен на стандартных объектах - Request и Response, кроме того он доступен в Worker-ax.
  То есть можно утверждать, что технология AJAX органически встроилась в комплекс браузерных API и является, на сегодняшний день, одной из основных тенденций в развитии Web. Разработка смещается в сторону frontend-а, и появился даже термин "лёгкий" backend.
  А это, как следствие, позволит в полной мере раскрыться огромным возможностям браузерного JavaScript с использованием API браузера, естественного доступа к которым больше нет ни у одного языка программирования, и которые, вдобавок, интенсивно развиваются.
  До недавнего времени программы JavaScript интерпретировались браузером в одном потоке с интерпретацией HTML-кода (асинхронные выполнения предусмотренные атрибутом ASYNC тега SCRIPT создавали сложности в согласовании установки обработчиков событий, да и не всегда гарантировали от задержек интерпретации HTML-кода), и это существенно ограничивало функционал языка.
  Однако, с появлением таких, например, интерфейсов как Worker и Promise, появилась возможность динамически запускать множество фоновых процессов и управлять ими из одного скрипта. Кроме того функционал событий дополнился функционалом "обещаний".
  А с учётом тенденций в развитии API браузера (например, File, IDB, Performance), получается, что современный JavaScript превратился в язык позволяющий создавать довольно сложные обрабатывающие системы с HTML-интерфейсом, на вычислительных мощностях клиентских устройств, и хорошим функционалом доступа к информационным ресурсам сервера.
  Конкуренция браузеров приводит к тому, что в JavaScript перманентно появляются новые операторы и объекты, кроме того расширяется понятийный аппарат языка.
  К появлению чего-то подталкивает развитие сетевых сервисов и оборудования. Что-то же появляется по предложениям разработчиков, теоретиков от программирования и производителей фреймворков, и зачастую, эти новшества, не сильно расширяя (по существу дублируя) функционал языка, делают его излишне громоздким и сложным в понимании. При этом речь идёт о таких понятиях как "базовый JavaScript" и "продвинутый JavaScript".
  Вот и множатся статьи посвящённый исследованиям той или иной "новейшей" функциональности JavaScript.
  В связи с этим, можно посоветовать, начинающим разработчикам не очень обращать на это внимание. Базовый JavaScript это простой и мощный язык, лёгкий в освоении и в практическом применении. Конечно, некоторых разработчиков хлебом не корми, а дай только сделать "мозгодробительный" код, а потом увлечённо обсуждать его в сети, да и кому не хочется приобщиться к "продвинутости".
  Однако язык программирования - это инструмент разработчика, а не, к примеру, физическая теория. И сама необходимость исследования функционала языка это нонсенс.

  Ведь старый добрый закон программирования как был, так и остаётся - "Из простого собирай сложное, а не наоборот".