ECMAScript — стандарт JavaScript, разработанный Ecma International . С 2015 года основные версии публикуются каждый июнь.
ECMAScript 2024, 15-я и текущая версия, была выпущена в июне 2024 года.
В июне 2004 года Ecma International опубликовала стандарт ECMA-357, определяющий расширение ECMAScript, известное как ECMAScript для XML (E4X). Ecma также определила «Компактный профиль» для ECMAScript, известный как ES-CP или ECMA 327, который был разработан для устройств с ограниченными ресурсами, и который был отозван в 2015 году. [14]
Предложенное четвертое издание ECMA-262 ( ECMAScript 4 или ES4 ) стало бы первым крупным обновлением ECMAScript с момента публикации третьего издания в 1999 году. Первоначально спецификация (вместе с эталонной реализацией) была запланирована к завершению к октябрю 2008 года. [15] Первый черновик был датирован февралем 1999 года. [16] Обзор языка был выпущен рабочей группой 23 октября 2007 года. [17]
К августу 2008 года предложение ECMAScript 4-й редакции было сокращено до кода проекта ECMAScript Harmony. В то время обсуждались следующие функции Harmony:
Целью этих функций было частично улучшить поддержку программирования в больших , а также позволить пожертвовать частью способности скрипта быть динамичным для повышения производительности. Например, Tamarin — виртуальная машина для ActionScript, разработанная и открытая Adobe — имеет поддержку компиляции just-in-time (JIT) для определенных классов скриптов.
Помимо внедрения новых функций, было предложено исправить некоторые ошибки ES3 в 4-м издании. [18] [19] Эти и другие исправления, а также поддержка кодирования/декодирования JSON были включены в спецификацию ECMAScript 5-го издания. [20]
Работа над 4-й редакцией началась после завершения спецификации ES-CP (Compact Profile) и продолжалась около 18 месяцев, в течение которых медленный прогресс был достигнут в уравновешивании теории спецификации JavaScript 2 Netscape с опытом внедрения JScript .NET от Microsoft. Через некоторое время фокус сместился на стандарт ECMAScript для XML (E4X). Обновление не обошлось без противоречий. В конце 2007 года дебаты между Эйхом, позднее техническим директором Mozilla Foundation , и Крисом Уилсоном, архитектором платформы Microsoft для Internet Explorer , стали публичными в ряде блогов . Уилсон предупредил, что, поскольку предлагаемые изменения в ECMAScript сделали его обратно несовместимым в некоторых отношениях с более ранними версиями языка, обновление равносильно «разрушению Сети» [21], и что заинтересованные стороны, выступавшие против изменений, были «скрыты из виду». [22] Эйх ответил, заявив, что Уилсон, похоже, «повторяет ложь в блогах», и отрицал, что была попытка подавить инакомыслие, и призвал критиков привести конкретные примеры несовместимости. [23] Он указал, что Microsoft Silverlight и Adobe AIR используют C# и ActionScript 3 соответственно, оба из которых больше и сложнее, чем ECMAScript Edition 3. [24]
Yahoo, Microsoft, Google и другие несогласные с 4-м изданием сформировали свой собственный подкомитет для разработки менее амбициозного обновления ECMAScript 3, предварительно названного ECMAScript 3.1. Это издание будет сосредоточено на обновлениях безопасности и библиотек с большим акцентом на совместимость. После вышеупомянутого публичного спарринга команды ECMAScript 3.1 и ECMAScript 4 договорились о компромиссе: над двумя изданиями будут работать параллельно, с координацией между командами, чтобы гарантировать, что ECMAScript 3.1 останется строгим подмножеством ECMAScript 4 как в семантике, так и в синтаксисе.
Однако различные философии в каждой команде привели к повторным нарушениям правила подмножества, и оставалось сомнительным, что несогласные с ECMAScript 4 когда-либо поддержат или реализуют ECMAScript 4 в будущем. Спустя более года после разногласий по поводу будущего ECMAScript в Техническом комитете Ecma 39, две команды достигли нового компромисса в июле 2008 года: Брендан Эйх объявил, что Ecma TC39 сосредоточит работу на проекте ECMAScript 3.1 (позже переименованном в ECMAScript, 5th Edition) при полном сотрудничестве всех сторон, а поставщики будут нацелены как минимум на две совместимые реализации к началу 2009 года. [25] [26] В апреле 2009 года Ecma TC39 опубликовал «окончательный» проект 5-го издания и объявил, что тестирование совместимых реализаций, как ожидается, будет завершено к середине июля. [27] 3 декабря 2009 года было опубликовано 5-е издание ECMA-262. [28]
Дополнения включают JSON , String.trim()
для простого удаления пробелов вокруг строки ( " example "
до "example"
), String.charAt()
для возврата одного символа из заданной позиции в строке и Array.isArray()
. Запятая после последней пары значений в объекте ( var example = { "property1":"value1", "property2":"value2", }
) также больше не вызывает синтаксическую ошибку. [29]
6-е издание, ECMAScript 6 ( ES6 ), позднее переименованное в ECMAScript 2015, было завершено в июне 2015 года. [4] [30] Это обновление добавляет значительно новый синтаксис для написания сложных приложений, включая объявления классов ( ), модули ES6, такие как , но определяет их семантически в тех же терминах, что и строгий режим ECMAScript 5. Другие новые функции включают итераторы и циклы, генераторы в стиле Python , выражение стрелочной функции ( ), ключевое слово для локальных объявлений, ключевое слово для константных локальных объявлений, двоичные данные, типизированные массивы, новые коллекции (карты, наборы и WeakMap), обещания , улучшения чисел и математики, отражение, прокси (метапрограммирование для виртуальных объектов и оберток) и литералы шаблонов, использующие обратные кавычки ( ) для многострочных строк без экранированных символов . [31] [32] Полный список обширен. [33] [34] Как первая спецификация «ECMAScript Harmony», она также известна как «ES6 Harmony».class Foo { ... }
import * as moduleName from "..."; export const Foo
for...of
() => {...}
let
const
`
Седьмое издание, или ECMAScript 2016, было завершено в июне 2016 года. [5] Его функции включают оператор возведения в степень **
для чисел await
, async
ключевые слова для асинхронного программирования (в качестве подготовки к ES2017) и Array.prototype.includes
функцию. [5] Оператор возведения в степень эквивалентен Math.pow
, но обеспечивает более простой синтаксис, похожий на такие языки, как Python, F#, Perl и Ruby. async
/ await
был воспринят как более простой способ использования обещаний и разработки асинхронного кода.
8-е издание, или ECMAScript 2017, было завершено в июне 2017 года. [6] Его возможности включают функции Object.values
, Object.entries
и Object.getOwnPropertyDescriptors
для легкой манипуляции объектами, async
/ await
конструкции, которые используют генераторы и обещания, а также дополнительные возможности для параллелизма и атомарности . Он также включает String.prototype.padStart()
. [35] [6]
9-е издание, или ECMAScript 2018, было завершено в июне 2018 года. [7] Новые функции включают оператор распространения и остаточные параметры ( ...
) для объектных литералов, асинхронную итерацию Promise.prototype.finally
и дополнения к RegExp. [7]
Оператор распространения позволяет легко копировать свойства объекта, как показано ниже.
пусть объект = { a : 1 , b : 2 } let objectClone = Object . assign ({}, object ) // до ES2018 let objectClone = {... object } // синтаксис ES2018 пусть другойОбъект = { c : 3 , ... объект } console.log ( другойОбъект ) // -> {c: 3 , a: 1, b : 2}
10-е издание, или ECMAScript 2019, было опубликовано в июне 2019 года. [8] Добавленные функции включают, помимо прочего, Array.prototype.flat
, Array.prototype.flatMap
, изменения в Array.sort
, и Object.fromEntries
. [8]
Array.sort
теперь гарантированно является стабильным , что означает, что элементы с одинаковыми ключами сортировки не изменят относительный порядок до и после операции сортировки. Array.prototype.flat(depth=1)
выравнивает массив до указанной глубины, что означает, что все элементы подмассива (до указанной глубины) рекурсивно объединяются.
Еще одним заметным изменением стало то, что так называемое связывание захватов стало необязательным. [36]
11-е издание, или ECMAScript 2020, было опубликовано в июне 2020 года. [9] Помимо новых функций, эта версия вводит BigInt
примитивный тип для целых чисел произвольного размера, оператор объединения nullish и объект globalThis . [9]
BigInts создаются либо с помощью BigInt
конструктора, либо с помощью синтаксиса 10n
, где "n" помещается после числового литерала. BigInts позволяют представлять и манипулировать целыми числами за пределами , в то время как Numbers представляются 64-битным значением IEEE 754Number.MAX_SAFE_INTEGER
двойной точности . Встроенные функции в несовместимы с BigInts; например, возведение в степень BigInts должно выполняться с помощью оператора вместо .Math
**
Math.pow
Оператор объединения nullish, ??
, возвращает свой правый операнд, когда его левая часть равна null
или undefined
. Это контрастирует с ||
оператором , который вернул бы "string"
для всех «ложных» значений, таких как приведенные ниже.
undefined ?? "string" // -> "string" null ?? "string" // -> "string" false ?? "string" // -> false NaN ?? "string" // -> NaN
Необязательное связывание позволяет получить доступ к вложенным свойствам объекта без проверки AND на каждом уровне. Примером является const zipcode = person?.address?.zipcode
. Если какие-либо свойства отсутствуют, zipcode
будет undefined
.
12-е издание, ECMAScript 2021, было опубликовано в июне 2021 года. [10] В этой версии представлен replaceAll
метод для строк; Promise.any
, комбинатор обещаний, который замыкается при выполнении входного значения; AggregateError
, новый тип ошибки для представления нескольких ошибок одновременно; логические операторы присваивания ( ??=
, &&=
, ||=
); WeakRef
, для ссылки на целевой объект без сохранения его от сборки мусора, и FinalizationRegistry
, для управления регистрацией и отменой регистрации операций очистки, выполняемых, когда целевые объекты подвергаются сборке мусора; разделители для числовых литералов ( 1_000
); и Array.prototype.sort
был сделан более точным, что сократило количество случаев, которые приводят к порядку сортировки, определяемому реализацией.
13-е издание, ECMAScript 2022, было опубликовано в июне 2022 года. [11] В этой версии представлен верхний уровень await
, позволяющий использовать ключевое слово на верхнем уровне модулей; новые элементы класса: публичные и приватные поля экземпляра, публичные и приватные статические поля, приватные методы и методы доступа экземпляра, а также приватные статические методы и методы доступа; статические блоки внутри классов для выполнения инициализации оценки для каждого класса; #x in obj
синтаксис для проверки наличия приватных полей в объектах; индексы соответствия регулярных выражений через /d
флаг, который предоставляет начальные и конечные индексы для сопоставленных подстрок; cause
свойство для Error
объектов, которое можно использовать для записи цепочки причин в ошибках; at
метод для строк, массивов и типизированных массивов, который допускает относительное индексирование; и Object.hasOwn
, удобная альтернатива Object.prototype.hasOwnProperty
.
14-е издание, ECMAScript 2023, было опубликовано в июне 2023 года. [37] В этой версии представлены методы toSorted
, toReversed
, with
, findLast
и для и , а также метод для ; добавлена поддержка комментариев shebang в начале файлов для лучшего упрощения исполняемых файлов ECMAScript; и разрешено использование большинства символов в качестве ключей в слабых коллекциях.findLastIndex
Array.prototype
TypedArray.prototype
toSpliced
Array.prototype
#!
15-е издание, ECMAScript 2024, было опубликовано в июне 2024 года. [38] В этой версии представлены статические методы Object.groupBy
и , а также флаг Unicode для регулярных выражений.Map.groupBy
Promise.withResolvers
/v
Методы Object.groupBy
и Map.groupBy
группируют итерируемый объект, используя возвращаемое значение предоставленной функции обратного вызова.
// выборка данных const arr = [ { year : "2024" , id : 0 }, { year : "2023" , id : 1 }, { year : "2024" , id : 2 }, ]; const obj = Object.groupBy ( arr , ( el ) = > el.year ) ; console.log ( obj ); // { "2024": [{ year: "2024", id: 0 } , { year : "2024", id: 2 }], "2023": [{ year: "2023", id: 1 }] }
Promise.withResolvers
предоставляет простой способ получить функции разрешения и отклонения обещания напрямую, без необходимости назначать их в конструкторе. [39]
// ES 2023 пусть разрешить ; пусть отклонить ; пусть обещание = новое Обещание (( res , rej ) => { resolve = res ; reject = rej ; }); // ES 2024 const { resolve , reject , promise } = Promise . withResolvers ();
Флаг /v
в регулярных выражениях — это просто улучшенная версия флага /u
, но поскольку он вносит обратно несовместимые изменения, его пришлось ввести как новый флаг. [40]
ES.Next — это динамическое имя, которое относится к следующей версии на момент написания. Функции ES.Next включают в себя готовые предложения (также известные как «предложения 4-го этапа»), перечисленные в готовых предложениях, которые не являются частью ратифицированной спецификации. Языковой комитет следует модели «живой спецификации», поэтому эти изменения являются частью стандарта, а ратификация — формальностью. [41]
{{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка ){{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка ){{cite web}}
: CS1 maint: неподходящий URL ( ссылка ){{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )