JavaScript

Материал из llmdocs — справочник разработчика
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]

См. также

Источники

  1. ECMA-262 — ECMAScript Language Specification (TC39)
  2. A. Wirfs-Brock, B. Eich — JavaScript: The First 20 Years (HOPL IV, 2020)
  3. MDN — JavaScript
  4. MDN — JavaScript execution model
  5. TC39 — Proposals
  6. Ecma International — ECMA-262