Что такое 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
И этого в стандарте тоже нет
- Файлы:
fs - Сеть:
http - Процессы:
process - Ни DOM, ни
window
Отсюда практический вывод: браузерный код не запустится в 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) устроены сложнее:
- код разбирается и начинает выполняться интерпретатором;
- движок следит, какие функции вызываются часто;
- горячие места компилируются в машинный код прямо на ходу — это JIT;
- если предположения о типах не подтвердились, оптимизация откатывается.
Поэтому строгое деление «интерпретируемый против компилируемого» к нему уже плохо применимо. Практически из этого следует одно: предсказуемые типы работают быстрее. Массив из одних чисел движок оптимизирует, массив из чисел, строк и объектов вперемешку — нет.
Где 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 — это одно и то же?
Чем ECMAScript отличается от JavaScript?
for, а браузер добавляет DOM, которого в стандарте нет.