ECMAScript
ECMAScript — это спецификация языка программирования, лежащая в основе языка JavaScript, а также ряда других языков (JScript, ActionScript). Разрабатывается и поддерживается международной организацией по стандартизации Ecma International (официальное название — European Computer Manufacturers Association) под руководством технического комитета TC39. ECMAScript определяет синтаксис, типы данных, операторы, встроенные объекты и механизмы выполнения кода, обеспечивая единообразие реализации языка в различных средах (браузерах, серверах, встраиваемых системах). Наиболее широко используемой реализацией ECMAScript является JavaScript, который, помимо соответствия стандарту, включает дополнительные возможности (например, для работы с веб-страницами).
История
Предыстория и создание (1995–1997)
Язык JavaScript был создан Бренданом Эйхом в 1995 году в компании Netscape Communications для добавления интерактивности в веб-страницы. Первоначально он назывался Mocha, затем LiveScript, и наконец JavaScript. Вскоре после выпуска Netscape Navigator 2.0 с поддержкой JavaScript компания Microsoft создала собственную реализацию — JScript, которая вошла в Internet Explorer 3.0. Различия в реализациях привели к проблемам совместимости.
Для стандартизации языка в 1996 году Netscape передала его спецификацию в Ecma International. В 1997 году был опубликован первый стандарт — ECMA-262, который определил язык под названием ECMAScript. Версия получила обозначение ECMAScript 1.
Развитие стандарта (1998–2009)
ECMAScript 2 (1998) и ECMAScript 3 (1999) внесли незначительные изменения и уточнения. ECMAScript 3 стал широко распространённой версией, на которой базировались все основные браузеры начала 2000-х. Попытка создать ECMAScript 4 (2000–2007) провалилась из-за разногласий между участниками комитета: одни хотели радикально расширить язык (классы, модули, типизация), другие — сохранить простоту. В результате работа над четвёртой версией была прекращена.
ECMAScript 5 и эпоха ES6 (2009–2015)
В 2009 году был выпущен ECMAScript 5 (ES5), который добавил строгий режим ("use strict"), методы для работы с массивами (forEach, map, filter), геттеры и сеттеры, а также поддержку JSON. ES5 стал стандартом для всех современных браузеров к 2012 году.
В 2015 году после долгих обсуждений была принята ECMAScript 2015 (ES6) — крупнейшее обновление за всю историю. Оно ввело классы, стрелочные функции, шаблонные строки, деструктуризацию, модули, промисы, генераторы, символы, let и const, а также множество других нововведений. ES6 кардинально изменил подход к написанию кода на JavaScript.
Ежегодные релизы (2016 — настоящее время)
Начиная с 2016 года комитет TC39 перешёл на ежегодный цикл выпуска новых версий ECMAScript. Каждая версия получает обозначение по году (ES2016, ES2017 и т. д.) и содержит только те возможности, которые прошли все стадии одобрения. Это позволило ускорить внедрение новых функций без длительных ожиданий.
Основные нововведения последних лет:
- ES2016: оператор возведения в степень (
**), методArray.prototype.includes. - ES2017: асинхронные функции (
async/await), методыObject.values,Object.entries. - ES2018: асинхронные итераторы, оператор rest/spread для объектов, улучшение регулярных выражений.
- ES2019:
Array.prototype.flat,Array.prototype.flatMap,Object.fromEntries. - ES2020: опциональная цепочка (
?.), нулевой оператор слияния (??), динамический импорт,BigInt,Promise.allSettled. - ES2021:
String.prototype.replaceAll, логические операторы присваивания (&&=,||=,??=), разделители разрядов в числах. - ES2022: методы
at()для массивов и строк,Object.hasOwn,Error.cause, классы с публичными и приватными полями. - ES2023: метод
Array.prototype.toSorted,Array.prototype.toReversed,Array.prototype.with,Array.prototype.findLast. - ES2024: группировка массивов (
Object.groupBy,Map.groupBy),Promise.withResolvers, флагvдля регулярных выражений.
Архитектура и ключевые понятия
Спецификация
Стандарт ECMAScript описан в документе ECMA-262. Он не определяет, как реализовывать язык (компилятор, интерпретатор), а задаёт поведение, которое должна обеспечивать любая реализация. Спецификация включает:
- Синтаксис: грамматика языка (лексемы, выражения, операторы, объявления).
- Типы данных: примитивные (число, строка, булевый,
undefined,null, символ,BigInt) и объектный (объекты, массивы, функции, даты, регулярные выражения). - Встроенные объекты:
Object,Array,Function,String,Number,Boolean,Date,RegExp,Math,JSON,Promise,Map,Set,WeakMap,WeakSet,Symbol,BigInt,Intlи другие. - Механизмы выполнения: алгоритмы преобразования типов, область видимости, замыкания, прототипное наследование, управление памятью (сборка мусора).
Прототипное наследование
В ECMAScript объекты наследуют свойства и методы через цепочку прототипов. Каждый объект имеет внутреннюю ссылку [[Prototype]] (доступную через Object.getPrototypeOf или свойство __proto__). При обращении к свойству объекта, если оно не найдено в самом объекте, поиск продолжается по цепочке прототипов. Это отличает ECMAScript от классического классового наследования, хотя с ES6 появился синтаксис class, который является синтаксическим сахаром над прототипами.
Динамическая типизация
Переменные в ECMAScript не имеют фиксированного типа. Тип значения определяется во время выполнения и может меняться. Например, одна и та же переменная может последовательно содержать число, строку и объект. Для проверки типа используется оператор typeof.
Строгий режим
Строгий режим ("use strict") был введён в ES5. Он отключает некоторые устаревшие возможности языка (например, неявное создание глобальных переменных, использование with) и превращает некоторые ошибки в исключения, что повышает надёжность кода.
Реализации и среда выполнения
Браузеры
Основная среда выполнения ECMAScript — веб-браузеры. Каждый браузер имеет собственный движок JavaScript, реализующий стандарт:
- V8 (Google Chrome, Opera, Brave, Edge) — один из самых быстрых движков, написан на C++.
- SpiderMonkey (Mozilla Firefox) — первый движок JavaScript, созданный Бренданом Эйхом.
- JavaScriptCore (Safari) — также известен как Nitro, часть WebKit.
- Chakra (старые версии Microsoft Edge) — ныне заменён на V8.
Серверные платформы
Наиболее популярная серверная реализация — Node.js, построенная на движке V8. Она предоставляет API для работы с файловой системой, сетью, процессами и другими ресурсами операционной системы. Другие серверные платформы: Deno (также на V8) и Bun (на собственном движке JavaScriptCore).
Другие среды
ECMAScript используется в:
- Adobe ActionScript (Flash, устарел).
- MongoDB — встроенный JavaScript для выполнения запросов.
- Qt QML — для описания интерфейсов.
- Google Apps Script — для автоматизации Google Workspace.
- Unity — частично через компиляцию в C#.
Версии стандарта
| Версия | Год выпуска | Ключевые нововведения |
|---|---|---|
| ES1 | 1997 | Первый стандарт |
| ES2 | 1998 | Незначительные изменения |
| ES3 | 1999 | Регулярные выражения, try/catch, switch, улучшенные строки |
| ES5 | 2009 | Строгий режим, JSON, геттеры/сеттеры, методы массивов |
| ES6 (ES2015) | 2015 | Классы, стрелочные функции, модули, промисы, let/const, генераторы |
| ES2016 | 2016 | **, Array.includes |
| ES2017 | 2017 | async/await, Object.values/entries |
| ES2018 | 2018 | Rest/spread для объектов, асинхронные итераторы |
| ES2019 | 2019 | flat, flatMap, Object.fromEntries |
| ES2020 | 2020 | ?., ??, BigInt, динамический импорт |
| ES2021 | 2021 | replaceAll, логические операторы присваивания |
| ES2022 | 2022 | at(), приватные поля классов, Error.cause |
| ES2023 | 2023 | toSorted, toReversed, findLast |
| ES2024 | 2024 | Object.groupBy, Promise.withResolvers |
Влияние и критика
Влияние на веб-разработку
ECMAScript стал основой современной веб-разработки. Благодаря стандартизации разработчики могут писать код, работающий во всех браузерах, а ежегодные обновления позволяют быстро внедрять новые возможности. ECMAScript также повлиял на другие языки (TypeScript, CoffeeScript, Dart), которые компилируются в JavaScript.
Критика
- Сложность спецификации: ECMA-262 насчитывает более 1000 страниц, что затрудняет её изучение.
- Обратная совместимость: необходимость поддерживать устаревшие конструкции (например,
var,with) замедляет развитие и увеличивает размер кода. - Производительность: динамическая типизация и прототипное наследование могут приводить к снижению производительности по сравнению со статически типизированными языками, хотя современные движки (V8, SpiderMonkey) используют JIT-компиляцию и оптимизации.
- Отсутствие строгой типизации: это может приводить к ошибкам, которые трудно обнаружить на этапе разработки. Решением стало появление TypeScript — надмножества ECMAScript со статической типизацией.
Будущее
Комитет TC39 продолжает работу над новыми возможностями. В стадии рассмотрения находятся:
- Декораторы (стадия 3) — для модификации классов и методов.
- Типовая аннотация (стадия 1) — возможность добавления статических типов в JavaScript.
- Паттерн-матчинг (стадия 1) — для сопоставления с образцом.
- Оператор
?=(стадия 1) — для безопасного присваивания.
Источники
- ECMA-262, 15th Edition (2024) — официальная спецификация.
- История создания JavaScript — Брендан Эйх, 2011.
- Документация MDN Web Docs по JavaScript.
- Статьи и презентации технического комитета TC39.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →