JavaScript
| JavaScript | |
|---|---|
| Логотип TC39, комитета, ответственного за обслуживание JavaScript | |
| Класс языка | |
| Тип исполнения | интерпретация, JIT в машинные коды[1] |
| Появился в | 4 декабря 1995 |
| Автор | Брендан Эйх |
| Расширение файлов |
.js, .cjs, .mjs[Спецификация 1] |
| Выпуск | ECMAScript 2024[2] (июнь 2024) |
| Система типов | динамическая, слабая, утиная |
| Основные реализации | SpiderMonkey, Rhino, KJS (JavaScript)[англ.], JavaScriptCore, V8 |
| Испытал влияние | Lua, Self[3], Си, Scheme[3], Perl[3], Python, Java[3], AWK[3], HyperTalk[3] |
| Повлиял на | ActionScript, AssemblyScript[англ.], CoffeeScript, Dart, Haxe, JS++[англ.], Opa[англ.], TypeScript |
| Сайт | ecma-international.org/… (англ.) |
| JavaScript | |
|---|---|
| | |
|
|
|
| Расширение |
.js[4] или .mjs[4] |
| MIME-тип | text/javascript, application/javascript[5][6] |
| Опубликован | сентябрь 1995[7] |
| Тип формата | текстовый файл с исходным кодом |
| Расширен из | ECMAScript |
| Сайт | ecma-international.org/… (англ.) |
JavaScript (англ. /ˈdʒɑːvəskrɪpt/; аббр. JS) — мультипарадигменный язык программирования. Поддерживает объектно-ориентированный, императивный и функциональный стили. Является реализацией спецификации ECMAScript (стандарт ECMA-262[2]).
JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам[8].
Основные архитектурные черты:
- динамическая типизация,
- слабая типизация,
- автоматическое управление памятью,
- прототипное программирование,
- функции как объекты первого класса.
На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java. Языком JavaScript не владеет какая-либо организация или компания, что отличает его от ряда языков программирования, используемых в веб-разработке[~ 1][9].
Название «JavaScript» является зарегистрированным товарным знаком корпорации Oracle в США[10].
В 1992 году компания Nombas (впоследствии приобретённая Openwave[англ.]) начала разработку встраиваемого скриптового языка Cmm (Си-минус-минус), который, по замыслу разработчиков, должен был стать достаточно мощным, чтобы заменить макросы, сохраняя при этом схожесть с Си, чтобы разработчикам не составляло труда изучить его[11]. Главным отличием от Си была работа с памятью. В новом языке всё управление памятью осуществлялось автоматически: не было необходимости создавать буфера, объявлять переменные, осуществлять преобразование типов. В остальном языки сильно походили друг на друга: в частности, Cmm поддерживал стандартные функции и операторы Си[12]. Cmm был переименован в ScriptEase, поскольку исходное название звучало слишком негативно, а упоминание в нём Си «отпугивало» людей[11][13]. На основе этого языка был создан проприетарный продукт CEnvi. В конце ноября 1995 года Nombas разработала версию CEnvi, внедряемую в веб-страницы. Страницы, которые можно было изменять с помощью скриптового языка, получили название Espresso Pages — они демонстрировали использование скриптового языка для создания игры, проверки пользовательского ввода в формы и создания анимации. Espresso Pages позиционировались как демоверсия, призванная помочь представить, что случится, если в браузер будет внедрён язык Cmm. Работали они только в 16-битовом Netscape Navigator под управлением Windows[14].
Самая первая реализация JavaScript была создана Бренданом Эйхом (англ. Brendan Eich) в компании Netscape, и с тех пор обновляется, чтобы соответствовать ECMA-262 Edition 5 и более поздним версиям. Этот движок называется SpiderMonkey и реализован на языке C/C++. Движок Rhino создан Норрисом Бойдом (англ. Norris Boyd) и реализован на языке Java. Как и SpiderMonkey, Rhino соответствует ECMA-262 Edition 5.
История
[править | править код]
Перед Бренданом Эйхом, нанятым в компанию Netscape 4 апреля 1995 года[16], была поставлена задача внедрить язык программирования Scheme или что-то похожее в браузер Netscape. Поскольку требования были размыты, Эйха перевели в группу, ответственную за серверные продукты, где он проработал месяц, занимаясь улучшением протокола HTTP[16]. В мае разработчик был переброшен обратно, в команду, занимающуюся клиентской частью (браузером), где он немедленно начал разрабатывать концепцию нового языка программирования. Менеджмент разработки браузера, включая Тома Пакина (англ. Tom Paquin), Михаэля Тоя[англ.], Рика Шелла (англ. Rick Schell), был убеждён, что Netscape должен поддерживать язык программирования, встраиваемый в HTML-код страницы[17].


Помимо Брендана Эйха, в разработке участвовали[16] сооснователь[18] Netscape Communications Марк Андрессен и сооснователь Sun Microsystems Билл Джой: чтобы успеть закончить работы над языком к релизу браузера, компании заключили соглашение о сотрудничестве в разработке[19]. Они ставили перед собой цель обеспечить «язык для склеивания» составляющих частей веб-ресурса: изображений, плагинов, Java-апплетов, который был бы удобен для веб-дизайнеров и программистов, не обладающих высокой квалификацией[16].
Первоначально по предложению Марка Андрессена[20] язык был назван Mocha[21][22][23], был реализован Бренданом Эйхом в течение десяти дней и впервые был включен в пре-альфу версию Netscape 2[20]. Затем он был переименован в LiveScript[23][24] и предназначался как для программирования на стороне клиента, так и для программирования на стороне сервера (там он должен был называться LiveWire)[19]. На синтаксис оказали влияние языки Си и Java, и, поскольку Java в то время было модным словом[16][19], 4 декабря 1995 года LiveScript переименовали в JavaScript[25], получив соответствующую лицензию у Sun. Анонс JavaScript со стороны представителей Netscape и Sun состоялся накануне выпуска второй бета-версии Netscape Navigator[16]. В нём декларируется, что 28 лидирующих ИТ-компаний выразили намерение использовать в своих будущих продуктах JavaScript как объектный скриптовый язык с открытым стандартом[26].
В 1996 году компания Microsoft выпустила аналог языка JavaScript, названный JScript. Анонсирован этот язык был 18 июля 1996 года[27]. Первым браузером, поддерживающим эту реализацию, был Internet Explorer 3.0.
По инициативе компании Netscape[28][29] была проведена стандартизация языка ассоциацией ECMA. Стандартизированная версия имеет название ECMAScript, описывается стандартом ECMA-262. Первой версии спецификации соответствовал JavaScript версии 1.1, а также языки JScript и ScriptEasy[11][19].
Популярность
[править | править код]В статье «The World’s Most Misunderstood Programming Language Has Become the World’s Most Popular Programming Language»[30] (с англ. — «Самый неправильно понятый язык программирования в мире стал самым популярным в мире языком программирования») Дуглас Крокфорд утверждает, что лидирующую позицию JavaScript занял в связи с развитием AJAX, поскольку браузер стал превалирующей системой доставки приложений.
Согласно TIOBE Index, базирующемуся на данных поисковых систем Google, MSN, Yahoo!, Википедия и YouTube, в 2024 году JavaScript находился на 6-м месте.
| Год | Положение JavaScript в TIOBE Index[31] |
|---|---|
| 2000 | 7 |
| 2005 | 10 |
| 2010 | 9 |
| 2015 | 8 |
| 2020 | 7 |
| 2025 | 6 |
В рейтинге популярности IEEE Spectrum в 2024 году JavaScript занял третье место[32].
JavaScript является самым популярным языком программирования, используемым для разработки веб-приложений на стороне клиента[33][34].
Возможности языка
[править | править код]JavaScript является объектно-ориентированным языком, но используемое в языке прототипирование[35][36] обуславливает различия в работе с объектами по сравнению с традиционными класс-ориентированными языками. Кроме того, JavaScript имеет ряд свойств, присущих функциональным языкам — функции как объекты первого класса, объекты как списки, карринг, анонимные функции, замыкания[37] — что придаёт языку дополнительную гибкость.
Несмотря на схожий с Си синтаксис, JavaScript по сравнению с языком Си имеет коренные различия:
- объекты с возможностью интроспекции;
- функции как объекты первого класса;
- автоматическое приведение типов;
- автоматическая сборка мусора;
- анонимные функции.
В языке отсутствуют такие полезные вещи[38], как:
- стандартная библиотека: в частности, отсутствует интерфейс программирования приложений по работе с файловой системой, управлению потоками ввода-вывода, базовых типов для бинарных данных;
- стандартные интерфейсы к веб-серверам и базам данных;
- система управления пакетами[~ 2], которая бы отслеживала зависимости и автоматически устанавливала их.
Семантика и синтаксис
[править | править код]Синтаксис языка JavaScript во многом напоминает синтаксис Си и Java, семантически же язык гораздо ближе к Self, Smalltalk или даже Лиспу[30][39][Спецификация 2].
В JavaScript:
- все идентификаторы регистрозависимы,
- в названиях переменных можно использовать буквы, подчёркивание, символ доллара, арабские цифры,
- названия переменных не могут начинаться с цифры,
- для оформления однострочных комментариев используются
//, многострочные и внутристрочные комментарии начинаются с/*и заканчиваются*/.
Структура языка
[править | править код]Структурно JavaScript можно представить в виде объединения трёх чётко различимых друг от друга частей[40][41][42][43]:
- ядро (ECMAScript),
- объектная модель браузера (Browser Object Model или BOM[англ.]),
- объектная модель документа (Document Object Model или DOM).
Если рассматривать JavaScript в отличных от браузера окружениях, то объектная модель браузера и объектная модель документа могут не поддерживаться[42].
Объектную модель документа иногда рассматривают как отдельную от JavaScript сущность[44][45][Спецификация 3], что согласуется с определением DOM как независимого от языка интерфейса документа[46]. При описании целей ES-Harmony Брендан Айх рассматривает как одну из целей создания языка, что он должен хорошо подходить для создания библиотек, которые, в том числе, могут включать и DOM[47]. Согласно этой концепции DOM представляет собой встроенную библиотеку[48], а JavaScript и ECMAScript эквивалентны, являясь разными названиями одной сущности[49]. Ряд авторов находит BOM и DOM тесно взаимосвязанными[50][51].
Ядро
[править | править код]ECMAScript не является браузерным языком и в нём не определяются методы ввода и вывода информации[40]. Это, скорее, основа для построения скриптовых языков. Спецификация ECMAScript описывает типы данных, инструкции, ключевые и зарезервированные слова, операторы, объекты, регулярные выражения, не ограничивая авторов производных языков в расширении их новыми составляющими.
Объектная модель браузера
[править | править код]Объектная модель браузера — браузер-специфичная часть языка[42][52], являющаяся прослойкой между ядром и объектной моделью документа[53]. Основное предназначение объектной модели браузера — управление окнами браузера и обеспечение их взаимодействия. Каждое из окон браузера представляется объектом window, центральным объектом DOM. Объектная модель браузера на данный момент не стандартизирована[42][54], однако спецификация находится в разработке WHATWG[53][Спецификация 4] и W3C[41][Спецификация 5].
Помимо управления окнами, в рамках объектной модели браузера браузерами обычно обеспечивается поддержка следующих сущностей[53][54]:
- управление фреймами,
- поддержка задержки в исполнении кода и зацикливания с задержкой,
- системные диалоги,
- управление адресом открытой страницы,
- управление информацией о браузере,
- управление информацией о параметрах монитора,
- ограниченное управление историей просмотра страниц,
- поддержка работы с HTTP cookie.
Объектная модель документа
[править | править код]Объектная модель документа — интерфейс программирования приложений для HTML и XML-документов[55]. Согласно DOM, документ (например, веб-страница) может быть представлен в виде дерева объектов, обладающих рядом свойств, которые позволяют производить с ним различные манипуляции:
- генерация и добавление узлов,
- получение узлов,
- изменение узлов,
- изменение связей между узлами,
- удаление узлов.
Встраивание в веб-страницы
[править | править код]Расположение внутри страницы
[править | править код]Для добавления JavaScript-кода на страницу можно использовать теги <script></script>[Спецификация 6], которые рекомендуется, но не обязательно, помещать внутри контейнера <head>. Контейнеров <script> в одном документе может быть сколько угодно. Атрибут type="text/javascript" указывать необязательно, данное значение используется по умолчанию[56].
Скрипт, выводящий модальное окно с классической надписью «Hello, World!» внутри браузера:
<script type="application/javascript">
alert('Hello, World!');
</script>
Расположение внутри тега
[править | править код]Спецификация HTML описывает набор атрибутов, используемых для задания обработчиков событий[Спецификация 7]. Пример использования:
<a href="delete.php" onclick="return confirm('Вы уверены?')">
Удалить
</a>
В приведённом примере при нажатии на ссылку функция confirm('Вы уверены?'); вызывает модальное окно с надписью «Вы уверены?», а return false; блокирует переход по ссылке. Этот код будет работать только если в браузере есть и включена поддержка JavaScript, иначе переход по ссылке произойдёт без предупреждения.
Использование кода JavaScript в контексте разметки страницы расценивается в рамках ненавязчивого JavaScript как плохая практика. Аналогом (при условии снабжения ссылки идентификатором alertLink)
<a href="delete.php" id="alertLink">
Удалить
</a>
приведённого примера может являться, например, следующий фрагмент JavaScript:
window.addEventListener('load', () => {
const linkWithAlert = document.getElementById('alertLink');
linkWithAlert.addEventListener('click', async (evt) => {
evt.preventDefault();
if (confirm('Вы уверены?')) {
await fetch('delete', { method: 'DELETE' });
}
});
});
Вынесение в отдельный файл
[править | править код]Есть и третья возможность подключения JavaScript — написать скрипт в отдельном файле, а потом подключить его с помощью конструкции

