JavaScript
| Парадигма | мультипарадигменный — событийный, функциональный, объектно-ориентированный (прототипы) |
|---|---|
| Автор | Брендан Айк (Netscape) |
| Появился | 1995 |
| Стандарт | ECMA-262 (ECMAScript), комитет TC39 |
| Типизация | динамическая, слабая |
| Движки | V8 (Chrome, Node.js), SpiderMonkey (Firefox), JavaScriptCore (Safari) |
| Среды выполнения | браузеры, Node.js, Deno, Bun |
| Расширения файлов | .js, .mjs, .cjs |
JavaScript (сокращённо JS) — динамический язык программирования, который выполняется в каждом веб-браузере и делает страницы интерактивными: реагирует на действия пользователя, меняет содержимое без перезагрузки, загружает данные с сервера. Вместе с HTML и CSS он образует основу веба. Благодаря средам выполнения вроде Node.js JavaScript используют и на серверах, в инструментах сборки, настольных приложениях (Electron) и скриптах командной строки.
Стандартизированное ядро языка называется ECMAScript; несмотря на название, с языком Java JavaScript почти ничего не связывает.
История
В мае 1995 года Брендан Айк в компании Netscape за десять дней создал прототип языка для браузера Netscape Navigator. Язык назывался Mocha, затем LiveScript, а в декабре 1995 года был переименован в JavaScript — на волне популярности Java и по маркетинговому соглашению с Sun Microsystems.[2] Microsoft выпустила совместимую реализацию JScript, и, чтобы язык не раздробился, Netscape передала его в организацию Ecma International: в 1997 году вышел стандарт ECMA-262.[6]
После ES3 (1999) развитие застопорилось: амбициозная ES4 была отменена в 2008 году. ES5 (2009) добавила строгий режим и JSON, а ES2015 (известная как ES6) стала крупнейшим обновлением: классы, модули, стрелочные функции, let и const, промисы, деструктуризация. С тех пор новая редакция выходит ежегодно. Предложения проходят пять стадий (0–4) в комитете TC39 и попадают в стандарт, когда реализованы как минимум в двух движках.[5]
Переломными для экосистемы стали движок V8 от Google (2008), резко ускоривший выполнение, и Node.js (2009), который перенёс язык на сервер.
Особенности языка
- Динамическая типизация. Тип связан со значением, а не с переменной. Для статической проверки поверх JS используют TypeScript.
- Функции — значения первого класса. Их передают как аргументы, возвращают из других функций, на них строятся замыкания.
- Прототипное наследование. Объекты наследуют свойства от других объектов; синтаксис
class— надстройка над прототипами. - Однопоточность и цикл событий. Код выполняется в одном потоке, а ввод-вывод не блокирует его: результаты приходят через колбэки, промисы и async/await.[4]
- Слабая типизация. Неявные приведения типов порождают известные странности:
[] + {}даёт строку, а"5" - 2равно 3. Поэтому сравнивают строгим===.
Пример
// модуль ES: импорт, константы, стрелочные функции, async/await
import { formatDate } from "./utils.js";
const API = "https://api.example.com/v1";
async function loadUsers(role = "admin") {
const res = await fetch(`${API}/users?role=${encodeURIComponent(role)}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const users = await res.json();
return users
.filter(u => u.active)
.map(({ id, name, createdAt }) => ({ id, name, since: formatDate(createdAt) }));
}
document.querySelector("#load").addEventListener("click", async () => {
const list = document.querySelector("#users");
list.replaceChildren(
...(await loadUsers()).map(u => Object.assign(document.createElement("li"), { textContent: u.name }))
);
});
Здесь видны основные приёмы современного кода: модули, шаблонные строки, деструктуризация, методы массивов, асинхронный fetch к REST-API с ответом в JSON и работа с DOM — деревом элементов страницы.
Цикл событий
Движок выполняет код до конца, а затем берёт следующую задачу из очереди: обработчик клика, сработавший таймер, пришедший сетевой ответ. Колбэки промисов (микрозадачи) выполняются раньше обычных задач. Долгий синхронный цикл блокирует всё — страница перестаёт реагировать, — поэтому тяжёлые вычисления переносят в Web Workers. Подробно модель выполнения описана на MDN.[4]
Экосистема
| Область | Инструменты |
|---|---|
| Пакеты | npm, pnpm, Yarn; реестр npm — крупнейший реестр пакетов |
| Серверные среды | Node.js, Deno, Bun |
| Фреймворки интерфейсов | React, Vue, Svelte, Angular |
| Сборка | Vite, esbuild, webpack, Rollup |
| Типизация | TypeScript |
| Тестирование | Vitest, Jest, Playwright |
Модульная система прошла путь от глобальных скриптов и CommonJS (require) в Node.js к стандартным ES-модулям (import/export), которые теперь поддерживают и браузеры, и серверные среды.
Где выполняется
- Браузер — доступ к DOM, событиям,
fetch, хранилищам, но нет доступа к файловой системе; код изолирован в песочнице. - Сервер и CLI — Node.js, Deno, Bun: файлы, сеть, процессы.
- Пограничные функции (edge) — запуск кода ближе к пользователю в CDN.
- WebAssembly дополняет JavaScript в браузере для задач, требующих скорости, но не заменяет его.
Самый полный справочник по языку и браузерным API — MDN Web Docs, а точное поведение определяет спецификация ECMA-262.[3][1]