Язык JavaScript

Язык JavaScript

JavaScript (сокращённо JS) – многофункциональный интерпретируемый язык программирования с объектно-ориентированными возможностями. Появился он в мае 1995 г. как часть самого популярного в то время браузера Netscape Navigator, разработчик Брендан Эйх (Brendan Eich), сотрудник компании Netscape. Пишут, что сделал он это всего за десять дней! Первоначально язык назывался Mocha, позже был переименован в LiveScript, а затем по маркетинговым соображениям стал известен нам как JavaScript. 

JavaScript (сокращённо JS) – многофункциональный интерпретируемый язык программирования с объектно-ориентированными возможностями. Появился он в мае 1995 г. как часть самого популярного в то время браузера Netscape Navigator, разработчик Брендан Эйх (Brendan Eich), сотрудник компании Netscape. Пишут, что сделал он это всего за десять дней! Первоначально язык назывался Mocha, позже был переименован в LiveScript, а затем по маркетинговым соображениям стал известен нам как JavaScript. 

<!DOCTYPE html>

<html lang="en">

   <head>

          <meta charset="utf-8">

          <title>Заголовок вашей HTML-страницы </title>       

          <script>

          Ваш код JavaScript обычно размещается здесь

          </script>

     </head>   

     <body>

Содержимое веб-страницы размещается здесь.

     </body>

</html>

 

Таким образом, программист включает код на JavaScript прямо в веб-страницу, а потом загружает её в браузер. Никакой компилятор или интерпретатор вызывать не надо – браузер сам сделает всё необходимое для исполнения написанного кода. Эта встроенная версия JavaScript запускает сценарии, внедренные в HTML-код веб-страниц, и называется клиентским языком JavaScript, чтобы подчеркнуть, что сценарий исполняется на клиентском компьютере, а не на веб-сервере. О серверном JavaScript, такой тоже есть, я расскажу отдельно.

Для отладки HTML-файл с кодом на JavaScript нужно просто загрузить с диска в браузер, и он будет исполнен. Более того, в HTML-страницу можно включить файл (например, code.js) с JavaScript-кодом.

<script src="code.js"></script>

Тут можно ещё упомянуть, что совместно с HTML, чтобы определить стиль оформления, отделённый от структуры страницы используется технология каскадных таблиц стилей CSS (Cascading Style Sheets), которая позволяет определить цвета, шрифты, границы, макет страницы. Вещь необходимая веб-мастеру, но с этим ему ещё нужно научиться работать. Это к тому, что JavaScript включается в HTML-страницу точно так же, как и CSS, т. е. он просто встраивается прямо в документ в тегах <script>.

Появились встроенные реализации JavaScript, существующие отдельно от браузеров. Это JavaScript Engine – движок, который может выполнять программу на JavaScript, в том числе на сервере. Один из самых популярных, движок с открытым исходным кодом V8 – был разработан корпорацией Google и используется в браузере Google Chrome. Он написан на С++; содержит JIT-компилятор, транслирующий исходный текст на JavaScript машинный код, который тут же оптимизируется и выполняется. Можно отметить и Rhino – также движок с открытым исходным кодом, написанный на Java. Разработан компанией Mozilla.

Движок SpiderMonkey был написан Бренданом Айком во время его работы в Netscape Communications, а позднее сделан открытым. В настоящее время SpiderMonkey поддерживается компанией Mozilla Foundation.

Наконец, JavaScriptCore – движок с открытым исходным кодом, разработанный корпорацией Apple для веб-браузера Safari. Среди других языков, отмечу JScript и Microsoft JScript.NET – это адаптации JavaScript, выполненные корпорацией Microsoft. Многие языки транскрибируются в JavaScript. Это в первую очередь TypeScript, Dart, Elm, PureScript и CoffeeScript.

Для JavaScript существует множество фреймворков, которые предоставляют функции для ускорения процесса создания приложений, делая этот процесс более легким и простым для веб-дизайна. Фреймворки предназначены для обеспечения общей функциональности, которая может быть изменена кодом написанным пользователем. Фреймворки делятся на две группы: для клиентской стороны и для серверной стороны. Перечислю некоторые из наиболее популярных фреймворков [4,5]:
-AngularJS –фреймворк с открытым исходным кодом для разработки одностраничных приложений;
- ReactJS – это JavaScript-библиотека, используемая для создания пользовательских интерфейсов;
- Vue.js – очень популярный фреймворк для создания пользовательских интерфейсов и одностраничных приложений;
- Next.js – фронтенд-фреймворк для создания пользовательских интерфейсов и статических веб-сайтов;
- Node.js — серверный фреймворк, среда выполнения JavaScript для разработки серверных приложений, основанная на движке V8;
- Express.js – бесплатный фреймворк с открытым исходным кодом для Node.js, предназначенный для создания веб-приложений и API.

Есть ещё несколько десятков фреймворков, которые здесь не перечислены (JQuery, Backbone.js, Ember.js, Meteor, Polymer, Svelte, Aurelia и др.).

Следует отметить графический API WebGL (Web Graphics Library) – API языка JavaScript для создания интерактивных компьютерных 3D- и 2D-графических изображений в любом стандартном веб-браузере без использования плагинов. Он позволяет графическому процессору (GPU) компьютера ускоренно обрабатывать изображения и реализовать графические эффекты в рамках данной веб-страницы.

Важная особенность JavaScript – безопасность. JavaScript не может получить доступ к памяти компьютера и к процессору, на котором исполняется скрипт напрямую. Нет доступа и к файловой системе, Когда JavaScript выполняется в браузере, он имеет доступ к специальным браузерным API, и работает через них. Для доступа к оборудованию, например к микрофону, видеокамере, нужно постоянно получать подтверждение от пользователя.

С точки зрения синтаксиса язык JavaScript напоминает C, C++ и Java такими программными конструкциями, как if, цикл while и операторами && и ||. Одно из наиболее распространённых заблуждений о JavaScript состоит в том, что этот язык представляет собой упрощенную версию языка Java. Однако это совсем не так и кроме указанной выше синтаксической схожести эти два языка между собой почти ничто не связывает – первоначальное название языка – LiveScript было изменено на JavaScript по просьбе маркетологов. Наконец, приложения, написанные на JavaScript, можно отлаживать прямо в браузере. (Имеются и более развитые отладчики – Microsoft Script Debugger в Internet Explorer, а в Firefox – модуль расширения Venkman.)

При написании программ на JavaScript используется набор символов Unicode. JavaScript – это нетипизированный язык, т. е. в нём не требуется определять типы переменных, типизация слабая и динамическая.

Ядро языка JavaScript поддерживает работу с такими простыми типами данных, как числа, строки и булевы значения, обладает также встроенной поддержкой массивов, дат и объектов регулярных выражений. Встроенные типы данных соответствуют таковым в других ЯВУ, кроме целых чисел. Они могут быть представлены в очень большом диапазоне от –9007199254740992 ( –253) до +9007199254740992 (253) включительно. Вне этого диапазона может теряться точность в младших разрядах целых чисел. Из отличий в типах данных отмечу, в JavaScript нет типа данных, такого как char в C, C++ и Java. Одиночный символ представлен строкой единичной длины.

Объявление переменной всегда начинается с ключевого слова var. Ключевое слово var впервые появилось в первой версии JavaScript в 1995 году. До появления var переменные в JavaScript нужно было объявлять с использованием ключевого слова let, которое было взято из языка программирования Си. Имя переменной должно начинаться с буквы, подчеркивания или знака доллара. В JavaScript регистр символов учитывается в именах переменных, ключевых словах, именах функций. Имена переменных, начинающиеся с $, обычно резервируются для библиотек JavaScript. Если начальное значение переменной не указано, JavaScript по умолчанию присваивает ей значение undefined, сообщая, что «переменная ещё не инициализирована».

Переменные делятся на локальные и глобальные. Специфика JavaScript в том, что если используется переменная, которая не была ранее объявлена, такая переменная будет считаться глобальной. Глобальные переменные существуют, пока существует веб-страница. Жизнь глобальной переменной начинается с момента загрузки кода JavaScript для страницы. Когда страница перестает существовать, то перестают существовать и глобальные переменные. Даже если перезагрузить эту страницу, все глобальные переменные будут уничтожены и созданы заново в перезагруженной браузером странице. Ещё одна особенность – если используется переменная, которая не была ранее объявлена, такая переменная считается глобальной, но если она оказалась внутри функции, то возможен неприятный сюрприз.

Классическая первая программа на JavaScript выглядит так:

<script>

  alert('Hello, World!');

</script>

 

JavaScript предоставляет несколько синтаксических конструкций для повторного выполнения кода: while, for, for in и forEach. Примеры:

var ps = 5;

while (ps > 0)  {

    document.write("Ещё одно исполнение цикла<br>");

    ps = ps - 1;

}

На этом примере видно, что в текст на JavaScript могут быть включены теги языка HTML, в данном случае <br> -- перевод строки. Веб-страница рассматривается браузером как документ, поэтому функция document.write позволяет вывести произвольную разметку HTML и контент в произвольной точке страницы.

var fact = 1;

for(i = 1; i < 10; i++) {

   fact = fact*i;

   document.write(i + "! = " + fact + "<br>");

}

В этой конструкции всё похоже на конструкции цикла в обычных процедурных ЯВУ.

JavaScript поддерживает работу с одномерными массивами, а поскольку он является нетипизированным языком, то элементы массива не обязательно должны иметь одинаковый тип – в отличие от многих других языков, в массиве могут храниться практически любые значения JavaScript, включая строки, числа, логические значения, другие массивы и даже объекты. Так команда

var myarray = new Array(5);

с помощью конструктора Array создает новый массив пятью пустыми позициями (то есть массив длины 5, который не содержит ни одного значения).

В JavaScript добавлена концепция «итерируемых» (iterable) объектов. Итерируемые или, иными словами, «перебираемые» объекты – это те, содержимое которых можно перебрать в цикле. Перебираемым объектом является массив. Но не только он. В браузере существует множество объектов, которые не являются массивами, но содержимое которых можно перебрать (к примеру, список DOM-узлов). Для перебора таких объектов добавлен новый синтаксис цикла: for..of.

 

let arr = [1, 2, 3, 4]; // массив — пример итерируемого объекта

for (let value of arr) {

alert(value); // 1, затем 2, затем 3, затем 4

}

Практически везде, где нужен перебор, он осуществляется через итераторы


JavaScript передает аргументы функциям по значению. Это означает, что каждый аргумент копируется в переменную-параметр и любые изменения параметра в функции затрагивают только сам параметр, но не исходную переменную. При этом функция игнорирует лишние аргументы, а параметрам, не получившим аргументов, присваивается значение undefined. Функция без команды return вернёт undefined.

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

Работа с объектами в JavaScript похожа на работу с ними в других объектно-ориентированных языках, но есть некоторые особенности, в частности, многие JavaScript-объекты и их свойства имеют те же имена, что и теги и атрибуты языка HTML, которые они обозначают, т. е. в дополнение к встроенным в браузер объектам, можно определить свои собственные объекты. Отметим, что сам JavaScript предоставляет множество готовых объектов, которые можно использовать в своем коде, в то же время программисту доступны и объекты самого браузера. Свойства объекта можно динамически добавлять к нему и удалять. Доступ к свойству можно получить с помощью точечной записи:

 

objectName.propertyName

 

или с помощью скобочной записи

 

objectName["propertyName"] = value

 

Все объекты в JavaScript наследуются как минимум от другого объекта. Объект, от которого произошло наследование, называется прототипом.

При написании приложений для браузера ключевую роль играют такие объекты браузера как

- document – служит для записи из программного кода в веб-страницу;

- метод log объекта console используется для вывода сообщений на консоль;

- Window представляет свойства, относящиеся к браузеру. На самом деле это очень важный объект – через него JavaScript подтягивает себе все объекты и методы, имеющиеся в браузере. В других ЯВУ это делается через набор многочисленных библиотек.

Программа на JavaScript взаимодействует с веб-страницей используя объектную модель документа DOM (Document Object Model). Рассмотрим, что это такое. При загрузке страницы браузер разбирает её HTML-разметку, выводит страницу на экран, и создает при этом набор объектов, представляющих разметку. Эти объекты и сохраняются в модели динамически. Таким образом, модель DOM, которая представляет собой не зависящий от платформы и языка программный интерфейс, позволяет программам и скриптам получить доступ к содержимому конкретной HTML-страницы, а также изменять содержимое, структуру и оформление страницы. Код JavaScript взаимодействует с DOM для получения доступа к элементам разметки и их содержимому как для создания, чтения, так и для удаления элементов. При любом изменении DOM браузер сразу же обновляет страницу.

Корнем каждой модели DOM является объект document, а под ним располагается дерево с ветвями и листовыми узлами для всех элементов разметки HTML. Объект document может использоваться в JavaScript для получения доступа ко всей модели DOM.

 

Например, найти на странице идентификатор абзаца с именем EC1045:

var computer = document.getElementById("EC1045");

Метод getElementById ищет элемент EC1045 и возвращает его.

Свойство innerHTML используется для чтения и замены содержимого элемента. В innerHTML возвращается внутреннее содержимое элемента, без тегов HTML. Заменим содержимое элемента EC1045:

computer.innerHTML = "Организация-разработчик: НИИММ, Ереван.";

Содержимое элемента EC1045 заменяется новым текстом, DOM и страница обновляются, а новый текст появляется в браузере.

Встроенный объект document содержит целый набор свойств и методов, с которыми достаточно плотно придётся работать JavaScript-программисту. Но это планида всех, кто занимается веб-разработкой на скриптовых языках, т. е. нужно глубоко погрузиться в HTML5, CSS и освоить некоторое множество методов и свойств JavaScript и браузеров. Замечу, что последние новости о JavaScript несколько настораживают – в сверхбольшая нейросетевая модель GPT 4.0 научили писать простые сценарии на этом языке. Вот пример от GPT 4.0 реализации шифра Цезаря на языке JavaScript:
function caesarCipher(text, shift) {

let cipherText = "";

  for (let i = 0; i < text.length; i++) {

    let char = text[i];

    if (char.match(/[a-z]/i)) {

      let charCode = text.charCodeAt(i);

      // Узнаем номер символа в алфавите, начиная с 0

      let charNum = (charCode - 65 + shift) % 26;  // если символ в верхнем регистре, начинать с 65 (A); если в нижнем - с 97 (a)

      cipherText += String.fromCharCode(charNum + 65);  // возвращаем символ, начиная с 65 (A) для верхнего регистра, строки charCodeAt

    } else {

      cipherText += char;

    }

  }

return cipherText;

Пример использования функции:

let text = "Hello, World!";

let shift = 5;

let cipherText = caesarCipher(text, shift);

console.log("Encrypted:", cipherText);  // "Mjqqt, Btwqi!"

Если щёлкнуть на веб-странице правой кнопкой мыши, то в появившемся ниспадающем меню вы увидите пункт «Показать код страницы». Код страницы появится либо в правой части окна, либо займет всё окно. В большинстве случаев это будет код на JavaScript, внедрённый в HTML-текст. Следует выбирать наиболее простые страницы, так называемые визитницы, поскольку иначе это будет довольно гремучая и трудночитаемая смесь.

Теперь о серверном JavaScript. Он имеет то же самое языковое ядро, что и клиентский JavaScript. Но, поскольку на сервере другая среда, то и JavaScript работает в ней иначе. Среди задач, которые могут быть запрограммированы в серверной среде, может быть установление соединения с реляционной базой данных, работа с файловой системой сервера и др. А это уже совсем другие объекты. Так серверный JavaScript включает объект database для соединения с внешней реляционной БД. Кроме того, серверное приложение может обрабатывать запросы от тысяч пользователей и работать с громадными объёмами данных. Серверный код JavaScript заключён в специальный тег </server> языка HTML, т. е. на странице может располагаться код, который будет выполняться либо на клиенте (тег </script>), либо на сервере. Поскольку задачи у клиентского и серверного JavaScript разные, то для каждой из сторон имеется свой большой набор предопределённых классов и объектов, которые исполняются только на конкретной стороне, но не работают на другой стороне. Но в целом, несмотря на перечисленные чудачества, JavaScript вполне элегантный и приятный язык. С появлением ряда мощных фреймворков, как Node.js, которые позволяют программистам использовать JavaScript для серверного программирования, JavaScript распространился и за пределы Интернета.

Автор благодарен Владимиру Биллигу, инициатору написания этого текста и сделавшему по нему ряд полезных замечаний.

Литература

  1. JavaScript History. https://www.w3schools.com/js/js_history.asp#:~:text=JavaScript%20was%20invented%20by%20Brendan,latest%20version%20was%201.8.5.

  2. History of JavaScript. https://www.geeksforgeeks.org/history-of-javascript/.

  3. Anna Maricheva. A Trip Back in Time: the History of JavaScript. https://softteco.com/blog/history-of-javascript

  4. Лучшие JavaScript-фреймворки 2023. https://aw.club/global/ru/blog/best-javascript-frameworks-2023

  5. Куаныш Шаметов. Популярные фреймворки JavaScript. https://vc.ru/dev/147263-populyarnye-freimvorki-javascript.

  6. Как создатель JavaScript Брендан Айк пришел к созданию своей компании. https://habr.com/ru/articles/313040/


Об авторе: Директор Виртуального Компьютерного Музея
Помещена в музей с разрешения автора 2 июня 2023
Отредактирована 10.10.2024