Что такое JavaScript и где он сегодня работает

Содержание

О проверке кода. Примеры не запускались — в отличие от материалов по Node.js, где приводится фактический вывод. Говорим прямо, а не ставим бейдж «проверено» без проверки.

Язык и среда — разные вещи

Главная путаница новичка выглядит так: «JavaScript — это для браузера». Уже нет, и это ключ ко всему остальному.

JavaScript — только язык: переменные, функции, объекты, циклы, классы, async/await. Он ничего не знает ни про кнопки, ни про файлы.

Всё интересное даёт среда. Браузер добавляет DOM, window, события мыши. Node.js — файлы, сеть, процессы. Язык один и тот же.

Один язык, разные среды

Сам язык (ECMAScript)

Работает везде одинаково

  • Переменные, типы, функции
  • Объекты, массивы, классы
  • Промисы и async/await
  • Map, Set, JSON
  • Ни строчки про кнопки и файлы

Что добавляет браузер

Этого нет в стандарте

  • DOM: document, элементы
  • window, location, history
  • События мыши и клавиатуры
  • fetch, localStorage

Что добавляет Node.js

И этого в стандарте тоже нет

Отсюда практический вывод: браузерный код не запустится в Node, и наоборот — но не потому, что «язык другой», а потому что вы зовёте API, которого в этой среде нет.

Java здесь ни при чём

Вопрос, который задают до сих пор. Ответ: общего только название.

JavaScript создали в Netscape в 1995 году за десять дней. Изначально он назывался Mocha, потом LiveScript, и уже перед релизом его переименовали в JavaScript — потому что Java тогда была на пике хайпа и имя помогало продавать.

Языки не связаны ничем: ни происхождением, ни системой типов, ни областью применения. Классическая формулировка: Java относится к JavaScript примерно как автомобиль к ковру — оба слова знакомые, связи нет.

ECMAScript: почему стандарт называется иначе

Название «JavaScript» осталось за Netscape как торговая марка. Поэтому, когда язык понесли в комитет по стандартизации, стандарт назвали ECMAScript — по имени организации ECMA.

Сегодня разделение такое:

  • ECMAScript — спецификация: что такое массив, как работает замыкание, в каком порядке выполняются промисы;
  • JavaScript — то, что вы пишете, плюс среда, в которой оно работает.

DOM в ECMAScript не входит. Это отдельный стандарт W3C. Поэтому document.querySelector — не «часть JavaScript», а часть браузера.

Версии: ES6, ES2015 и почему это одно и то же

Источник постоянной путаницы в статьях.

Название Что это
ES5 (2009) база, на которой держался веб десять лет
ES6 = ES2015 огромное обновление: let, const, стрелки, классы, промисы, модули
ES2016, ES2017… ежегодные выпуски, по имени года

После 2015 года стандарт выходит раз в год. Обновления стали маленькими и предсказуемыми: async/await — ES2017, Promise.allSettled — ES2020, Promise.any — ES2021.

Название «ES6» прижилось как разговорное имя того самого большого скачка. Формально правильно «ES2015», но говорят и так, и так — это отдельная тема.

Практический вывод: гоняться за версиями не нужно. Все живые браузеры и все поддерживаемые версии Node понимают стандарт последних лет. Вопрос «поддерживается ли эта возможность» решается на caniuse.com, а не подсчётом версий.

Интерпретируемый или компилируемый

Классический вопрос собеседования, ответ на который за годы устарел.

Формально JavaScript — интерпретируемый: исходник отдаётся движку, отдельной сборки в бинарник нет. Но современные движки (V8 в Chrome и Node, SpiderMonkey в Firefox) устроены сложнее:

  1. код разбирается и начинает выполняться интерпретатором;
  2. движок следит, какие функции вызываются часто;
  3. горячие места компилируются в машинный код прямо на ходу — это JIT;
  4. если предположения о типах не подтвердились, оптимизация откатывается.

Поэтому строгое деление «интерпретируемый против компилируемого» к нему уже плохо применимо. Практически из этого следует одно: предсказуемые типы работают быстрее. Массив из одних чисел движок оптимизирует, массив из чисел, строк и объектов вперемешку — нет.

Где JavaScript работает сегодня

  • Браузер — исходная и до сих пор главная среда;
  • СерверNode.js, Deno, Bun;
  • Мобильные приложения — React Native;
  • Десктоп — Electron: VS Code, Slack, Discord;
  • Edge и облака — Cloudflare Workers и подобные;
  • Встраиваемые системы — микроконтроллеры через отдельные движки.

Это результат одной особенности: язык привязан не к платформе, а к движку. Есть движок — есть JavaScript.

Что было на этой странице в 2017 году

Первая версия вышла 12 июля 2017 года и определяла JavaScript как «мультипарадигменный язык программирования, поддерживающий объектно-ориентированный, императивный и функциональный стили». Определение верное и сегодня — просто оно отвечает не на тот вопрос, с которым сюда приходят.

Что изменилось за девять лет:

  • ES6 перестал быть новостью. В 2017-м let, стрелки и классы ещё подавались как «новые возможности», а в проектах стоял Babel, чтобы превратить их в ES5 для старых браузеров. Сегодня это просто язык.
  • TypeScript стал нормой, а не экзотикой. В 2017-м вопрос «JS или TS» ещё имел смысл; сейчас в большинстве команд ответ по умолчанию — TS.
  • Годовой цикл стандарта стал привычкой. Тогда ждали «следующую большую версию» — теперь каждый год приезжает по чуть-чуть, и это никого не волнует.

А вот путаница «JavaScript и Java — это одно?» никуда не делась за тридцать лет. Поэтому раздел про неё остался.


Смежные темы: что такое Node.js — тот же язык на сервере; ECMAScript 6 — что принесло то самое обновление; массивы в JavaScript; уроки JavaScript — весь раздел.

Частые вопросы

JavaScript и Java — это одно и то же?
Нет, и общего у них только четыре буквы в названии. Имя было маркетинговым ходом 1995 года: Java тогда была на пике популярности. Языки не связаны ни происхождением, ни синтаксисом, ни областью применения.
Чем ECMAScript отличается от JavaScript?
ECMAScript — это спецификация языка, стандарт. JavaScript — его реализация плюс окружение, в котором он работает. Грубо: ECMAScript описывает, что такое массив и как работает for, а браузер добавляет DOM, которого в стандарте нет.
JavaScript — интерпретируемый язык?
Формально да, но современные движки компилируют горячий код в машинный на лету (JIT). Строгое деление «интерпретируемый против компилируемого» к нему уже плохо применимо.
Что учить: JavaScript или TypeScript?
Сначала JavaScript. TypeScript — это тот же язык плюс проверка типов на этапе сборки; в браузере всё равно выполняется JS. Не понимая базу, вы будете спорить с типами, не понимая, о чём они.
Почему во всех статьях разные версии — ES6, ES2015, ES2021?
ES6 и ES2015 — одно и то же: с 2015 года стандарт выходит ежегодно и называется по году. «ES6» осталось разговорным именем того самого большого обновления.