Открыть сервис

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#.

Версии стандарта

ВерсияГод выпускаКлючевые нововведения
ES11997Первый стандарт
ES21998Незначительные изменения
ES31999Регулярные выражения, try/catch, switch, улучшенные строки
ES52009Строгий режим, JSON, геттеры/сеттеры, методы массивов
ES6 (ES2015)2015Классы, стрелочные функции, модули, промисы, let/const, генераторы
ES20162016**, Array.includes
ES20172017async/await, Object.values/entries
ES20182018Rest/spread для объектов, асинхронные итераторы
ES20192019flat, flatMap, Object.fromEntries
ES20202020?., ??, BigInt, динамический импорт
ES20212021replaceAll, логические операторы присваивания
ES20222022at(), приватные поля классов, Error.cause
ES20232023toSorted, toReversed, findLast
ES20242024Object.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 →