# JavaScript

> Динамический язык программирования веба, выполняемый в каждом браузере, а также на серверах через Node.js, Deno и Bun; стандартизирован как ECMAScript.

Источник: https://llmdocs.ru/wiki/javascript/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Парадигма**: мультипарадигменный — событийный, функциональный, объектно-ориентированный (прототипы)
- **Автор**: Брендан Айк (Netscape)
- **Появился**: 1995
- **Стандарт**: ECMA-262 (ECMAScript), комитет TC39
- **Типизация**: динамическая, слабая
- **Движки**: V8 (Chrome, Node.js), SpiderMonkey (Firefox), JavaScriptCore (Safari)
- **Среды выполнения**: браузеры, Node.js, Deno, Bun
- **Расширения файлов**: .js, .mjs, .cjs
**JavaScript** (сокращённо **JS**) — динамический язык программирования, который выполняется в каждом веб-браузере и делает страницы интерактивными: реагирует на действия пользователя, меняет содержимое без перезагрузки, загружает данные с сервера. Вместе с [HTML](https://llmdocs.ru/wiki/html.md) и [CSS](https://llmdocs.ru/wiki/css.md) он образует основу веба. Благодаря средам выполнения вроде [Node.js](https://llmdocs.ru/wiki/nodejs.md) 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](https://llmdocs.ru/wiki/typescript.md).
- **Функции — значения первого класса.** Их передают как аргументы, возвращают из других функций, на них строятся замыкания.
- **Прототипное наследование.** Объекты наследуют свойства от других объектов; синтаксис `class` — надстройка над прототипами.
- **Однопоточность и цикл событий.** Код выполняется в одном потоке, а ввод-вывод не блокирует его: результаты приходят через колбэки, [промисы и async/await](https://llmdocs.ru/wiki/js-promises-async.md).[4]
- **Слабая типизация.** Неявные приведения типов порождают известные странности: `[] + {}` даёт строку, а `"5" - 2` равно 3. Поэтому сравнивают строгим `===`.

## Пример

```javascript
// модуль 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](https://llmdocs.ru/wiki/rest.md)-API с ответом в [JSON](https://llmdocs.ru/wiki/json.md) и работа с [DOM](https://llmdocs.ru/wiki/dom.md) — деревом элементов страницы.

## Цикл событий

Движок выполняет код до конца, а затем берёт следующую задачу из очереди: обработчик клика, сработавший таймер, пришедший сетевой ответ. Колбэки промисов (микрозадачи) выполняются раньше обычных задач. Долгий синхронный цикл блокирует всё — страница перестаёт реагировать, — поэтому тяжёлые вычисления переносят в Web Workers. Подробно модель выполнения описана на MDN.[4]

## Экосистема

| Область | Инструменты |
|---|---|
| Пакеты | [npm](https://llmdocs.ru/wiki/npm.md), pnpm, Yarn; реестр npm — крупнейший реестр пакетов |
| Серверные среды | [Node.js](https://llmdocs.ru/wiki/nodejs.md), Deno, Bun |
| Фреймворки интерфейсов | React, Vue, Svelte, Angular |
| Сборка | Vite, esbuild, webpack, Rollup |
| Типизация | [TypeScript](https://llmdocs.ru/wiki/typescript.md) |
| Тестирование | Vitest, Jest, Playwright |

Модульная система прошла путь от глобальных скриптов и CommonJS (`require`) в Node.js к стандартным **ES-модулям** (`import`/`export`), которые теперь поддерживают и браузеры, и серверные среды.

## Где выполняется

- **Браузер** — доступ к DOM, событиям, `fetch`, хранилищам, но нет доступа к файловой системе; код изолирован в песочнице.
- **Сервер и CLI** — Node.js, Deno, Bun: файлы, сеть, процессы.
- **Пограничные функции** (*edge*) — запуск кода ближе к пользователю в [CDN](https://llmdocs.ru/wiki/cdn.md).
- **WebAssembly** дополняет JavaScript в браузере для задач, требующих скорости, но не заменяет его.

Самый полный справочник по языку и браузерным API — MDN Web Docs, а точное поведение определяет спецификация ECMA-262.[3][1]

## См. также

- [TypeScript](https://llmdocs.ru/wiki/typescript.md)
- [Node.js](https://llmdocs.ru/wiki/nodejs.md)
- [DOM](https://llmdocs.ru/wiki/dom.md)
- [Промисы и async/await (JS)](https://llmdocs.ru/wiki/js-promises-async.md)
- [npm](https://llmdocs.ru/wiki/npm.md)

## Источники

1. [ECMA-262 — ECMAScript Language Specification (TC39)](https://tc39.es/ecma262/)
2. [A. Wirfs-Brock, B. Eich — JavaScript: The First 20 Years (HOPL IV, 2020)](https://dl.acm.org/doi/10.1145/3386327)
3. [MDN — JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
4. [MDN — JavaScript execution model](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Execution_model)
5. [TC39 — Proposals](https://github.com/tc39/proposals)
6. [Ecma International — ECMA-262](https://ecma-international.org/publications-and-standards/standards/ecma-262/)
