ECMAScript

Материал из wikixw
Перейти к навигации Перейти к поиску

ECMAScript (/ˈ ɛ k mə s k r ɪ p t /) (или ES) - это стандарт JavaScript, предназначенный для обеспечения совместимости веб-страниц в разных браузерах. Он стандартизирован Ecma International в соответствии с документом ECMA-262. ECMAScript обычно используется для написания сценариев на стороне клиента во Всемирной паутине, и он все чаще используется для написания серверных приложений и служб с использованием Node.js .

ECMAScript, ECMA-262 и JavaScript[править]

ECMA-262 или спецификация языка ECMAScript определяет язык ECMAScript или просто ECMAScript. ECMA-262 определяет только синтаксис языка и семантику основного API, такие как Массив, Функция, и globalThis, в то время как допустимые реализации JavaScript добавляют свои собственные функции, такие как ввод / вывод или обработка файловой системы.

История[править]

Спецификация ECMAScript - это стандартизированная спецификация языка сценариев, разработанная Бренданом Эйхом из Netscape; первоначально она называлась Mocha, затем LiveScript и, наконец, JavaScript. В декабре 1995 года Sun Microsystems и Netscape анонсировали JavaScript в пресс-релизе. В ноябре 1996 года Netscape объявила о встречеEcma Международная организация по стандартизации для продвижения стандартизации JavaScript. Первое издание ECMA-262 было принято Генеральной Ассамблеей Ecma в июне 1997 года. С тех пор вышло несколько изданий стандарта языка. Название "ECMAScript" было компромиссом между организациями, занимающимися стандартизацией языка, особенно Netscape и Microsoft, чьи споры доминировали на ранних сессиях стандартов. Эйх отметил, что "ECMAScript всегда был нежелательным торговым названием, которое звучит как кожное заболевание".[7] ECMAScript был формализован через операционную семантику работой в Стэнфордском университете и на факультете вычислительной техники Имперского колледжа Лондона для анализа и стандартизации безопасности.

Версии[править]

Опубликовано одиннадцать изданий ECMA-262. Работа над 12-й версией стандарта была завершена в июне 2021 года. История версий ECMAScript

В июне 2004 года Ecma International опубликовала стандарт ECMA-357, определяющий расширение ECMAScript, известное как ECMAScript for XML (E4X). Ecma также определила "Компактный профиль" для ECMAScript – известный как ES-CP, или ECMA 327 – который был разработан для устройств с ограниченными ресурсами, который был отозван в 2015 году.

4-е издание (заброшенное)[править]

Предлагаемое четвертое издание ECMA-262 (ECMAScript 4 или ES4) было бы первым крупным обновлением ECMAScript с момента публикации третьего издания в 1999 году. Спецификация (вместе с эталонной реализацией) первоначально планировалась к завершению к октябрю 2008 года. Первый проект был датирован февралем 1999 года.[19] Обзор языка был выпущен рабочей группой 23 октября 2007 года.

К августу 2008 года предложение ECMAScript 4th edition было сокращено до проекта с кодом ECMAScript Harmony. Функции, обсуждаемые для Harmony в то время, включали:

  1. классы,
  2. модульная система,
  3. необязательные аннотации типов и статическая типизация, вероятно, с использованием системы структурных типов,
  4. генераторы и итераторы,
  5. назначение деструктурирования и
  6. алгебраические типы данных.

Цель этих функций состояла отчасти в том, чтобы лучше поддерживать программирование в целом и позволять жертвовать некоторой способностью скрипта быть динамичным для повышения производительности. Например, Tamarin – виртуальная машина для ActionScript, разработанная Adobe с открытым исходным кодом, - поддерживает JIT-компиляцию определенных классов скриптов.

В дополнение к введению новых функций, некоторые ошибки ES3 были предложены для исправления в издании 4. Эти и другие исправления, а также поддержка кодирования / декодирования JSON были включены в спецификацию ECMAScript, 5th Edition.

Работа началась в издании 4 после того, как спецификация ES-CP (Compact Profile) была завершена, и продолжалась примерно 18 месяцев, где был достигнут медленный прогресс, уравновешивающий теорию спецификации JavaScript 2 Netscape с опытом реализации JScript .NET от Microsoft. Через некоторое время акцент сместился на стандарт ECMAScript for XML (E4X). Обновление не обошлось без споров. В конце 2007 года дебаты между Эйхом, позже техническим директором Mozilla Foundation, и Крисом Уилсоном, архитектором платформы Microsoft для Internet Explorer, стали достоянием общественности в ряде блогов. Уилсон предупредил, что, поскольку предлагаемые изменения в ECMAScript сделали его обратно несовместимым в некоторых отношениях с более ранними версиями языка, обновление равносильно "нарушению Сети" и что заинтересованные стороны, которые выступали против изменений, были "скрыты от глаз".Он, казалось, "повторял ложь в блогах" и отрицал, что была попытка подавить инакомыслие, и призвал критиков привести конкретные примеры несовместимости. Он указал, что Microsoft Silverlight и Adobe AIR полагаются на C # иActionScript 3 соответственно, оба из которых больше и сложнее, чем ECMAScript Edition 3.

5-е издание[править]

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 года Ecma TC39 опубликовала "окончательный" проект 5-го издания и объявила, что тестирование совместимых реализаций должно быть завершено к середине июля. было опубликовано 5-е издание ECMA-262[31].

6–е издание - ECMAScript 2015[править]

6-е издание, ECMAScript 6 (ES6), позже переименованное в ECMAScript 2015, было завершено в июне 2015 года.Это обновление добавляет значительный новый синтаксис для написания сложных приложений, включая объявления классов (class Foo { ... }), модули ES6import * as moduleName from "..."; export const Foo, но определяет их семантически в тех же терминах, что и ECMAScript 5строгий режим. Другие новые функции включают итераторы и for...ofциклы, генераторы в стиле Python, выражение функции стрелки (() => {...}), letключевое слово для локальных объявлений, constключевое слово для постоянных локальных объявлений, двоичные данные, типизированные массивы, новые коллекции (maps, sets и WeakMap), обещания, улучшения числа и математики, отражение, прокси (метапрограммирование для виртуальныхобъекты и оболочки) и шаблонные литералы для строк. Полный список обширен.[35][36] Как первая спецификация "ECMAScript Harmony", она также известна как "ES6 Harmony".

7–е издание - ECMAScript 2016[править]

7-е издание, или ECMAScript 2016, было завершено в июне 2016 года.[12] Его функции включают в себя блок-область переменных и функций, шаблоны деструктурирования (переменных), правильные хвостовые вызовы, оператор возведения **в степень для чиселawait, asyncключевые слова для асинхронного программирования (как подготовка к ES2017) и Array.prototype.includesфункцию.

Оператор возведения в степень эквивалентенMath.pow, но обеспечивает более простой синтаксис, подобный языкам, таким как Python, F #, Perl и Ruby. async/ awaitбыл провозглашен как более простой способ использования обещаний и разработки асинхронного кода.

8–е издание - ECMAScript 2017[править]

8-е издание, или ECMAScript 2017, было завершено в июне 2017 года.[13] Его функции включают функции Object.values, Object.entriesи Object.getOwnPropertyDescriptorsдля легкого манипулирования объектами, async/ awaitконструкции, которые используют генераторы и обещания, а также дополнительные функции для параллелизма и атомарности.

9–е издание - ECMAScript 2018[править]

9-е издание, или ECMAScript 2018, было завершено в июне 2018 года. Новые функции включают оператор spread и параметры rest (...) для объектных литералов, асинхронную итерацию Promise.prototype.finallyи дополнения к регулярному выражению.

Оператор spread позволяет легко копировать свойства объекта, как показано ниже.

let  object = {a: 1, b: 2}
let  objectClone = Object.assign({}, object) // до ES2018
let  objectClone = {...object} // Синтаксис
ES2018 let  otherObject = {c: 3, ...object}
console.log(otherObject) // -> {c: 3, a: 1, b: 2}

10–е издание - ECMAScript 2019[править]

10-е издание, или ECMAScript 2019, было опубликовано в июне 2019 года. Добавленные функции включают, но не ограничиваютсяArray.prototype.flat, Array.prototype.flatMapизменениями в Array.sortand Object.fromEntries.

Array.sort теперь гарантируется стабильность, а это означает, что элементы с одинаковым приоритетом сортировки будут появляться в отсортированном массиве в одном и том же порядке. Array.prototype.flat(depth=1)выравнивает массив до заданной глубины, что означает, что все элементы подмассива (до заданной глубины) рекурсивно конкатенируются.

Еще одним заметным изменением является то, что так называемая привязка catch стала необязательной.

11–е издание - ECMAScript 2020[править]

11-е издание, или ECMAScript 2020, было опубликовано в июне 2020 года. В дополнение к новым функциям, эта версия вводит BigIntпримитивный тип для целых чисел произвольного размера, нулевой оператор коалесцирования и объект globalThis.

BigInts создаются либо с BigIntпомощью конструктора, либо с помощью синтаксиса10n, где "n" ставится после числового литерала. BigInts позволяют представлять и манипулировать целыми числами за пределамиNumber.MAX_SAFE_INTEGER, в то время как числа представлены 64-битным значением IEEE 754 с двойной точностью. Встроенные функции in Mathнесовместимы с BigInts; например, возведение в степень BigInts должно выполняться с **помощью оператора вместо Math.pow.

Нулевой коалесцирующий оператор, ??, возвращает свой правый операнд, когда его левая часть равна nullили undefined. Это контрастирует с ||оператором, который будет возвращать "string"все "ложные" значения, такие как приведенные ниже.

undefined ?? "string" // -> "string"
null ?? "string" // -> "string"
false ?? "string" // -> false
NaN ?? "string" // -> NaN

Необязательная цепочка позволяет получить доступ к вложенным свойствам объекта без проверки И на каждом уровне. Примером может служить const zipcode = person?.address?.zipcode. Если какое-либо из свойств отсутствует, zipcodeбудет undefined.

12–е издание - ECMAScript 2021[править]

12-е издание, или ECMAScript 2021, было опубликовано в июне 2021 года. Эта версия вводит replaceAllметод для строк; Promise.any, комбинатор обещаний, который закорачивает, когда выполняется входное значение; AggregateError, новый тип ошибки для представления нескольких ошибок одновременно; логические операторы присваивания (??=, &&=, ||=);WeakRefдля обращения к целевому объекту без сохранения его от сборки мусора, а FinalizationRegistryтакже для управления регистрацией и отменой регистрации операций очистки, выполняемых при сборе мусора целевыми объектами; разделители для числовых литералов (1_000); и Array.prototype.sortбыл сделан более точным, уменьшая количество случаев, которые приводят к определенному реализацией порядку сортировки.

ES.Next[править]

ES.Next - это динамическое имя, которое относится к любой следующей версии на момент написания. ES.Следующие функции включают готовые предложения (aka "stage 4 proposals"), перечисленные в разделе готовые предложения, которые не являются частью ратифицированной спецификации. Языковой комитет следует модели "живой спецификации", поэтому эти изменения являются частью стандарта, а ратификация является формальностью.

Характеристики[править]

Основные статьи: Синтаксис ECMAScript и JavaScript § Особенности

Язык ECMAScript включает в себя структурированные, динамические, функциональные и основанные на прототипах функции[40]. Императивный и структурированный

ECMAScript JavaScript поддерживает структурированное программирование в стиле Си. Ранее JavaScript поддерживал только область видимости функций с использованием ключевого varслова, но ECMAScript 2015 добавил ключевые letслова и constпозволил JavaScript поддерживать как область видимости блоков, так и область видимости функций. JavaScript поддерживает автоматическую вставку точки с запятой, что означает, что точки с запятой, которые обычно используются для завершения оператора в C, могут быть опущены в JavaScript.

Как и в языках C-стиля, поток управления выполняется с whileпомощью операторов , for, do/ while, if/ elseи switch. Функции слабо типизированы и могут принимать и возвращать любой тип. Аргументы не указаны по умолчанию undefined.

Слабо типизированный[править]

ECMAScript слабо типизирован. Это означает, что определенные типы назначаются неявно на основе выполняемой операции. Тем не менее, есть несколько причуд в реализации JavaScript преобразования переменной из одного типа в другой. Эти причуды были предметом разговора под названием Wat.

Динамический[править]

ECMAScript динамически типизирован. Таким образом, тип связан со значением, а не с выражением. ECMAScript поддерживает различные способы проверки типа объектов, включая утиную типизацию[44].

Транспилинг[править]

Основная статья: JavaScript § транспиляторы

Начиная с ES 2015, транспилирование JavaScript стало очень распространенным явлением. Транспиляция - это компиляция от источника к источнику, в которой используются более новые версии JavaScript, и транспилятор переписывает исходный код так, чтобы он поддерживался старыми браузерами. Обычно транспиляторы транспилируются до ES3, чтобы поддерживать совместимость со всеми версиями браузеров. Параметры переноса на определенную версию могут быть настроены в зависимости от необходимости. Транспилирование добавляет дополнительный шаг к процессу сборки и иногда делается, чтобы избежать необходимости полифиллов. Полифиллы создают новые возможности для старых сред, в которых они отсутствуют. Полифиллы делают это во время выполнения в интерпретаторе, например в браузере пользователя или на сервере. Вместо этого transpiling переписывает сам код ECMA во время фазы сборки разработки, прежде чем он достигнет интерпретатора.

Соответствие[править]

В 2010 году Ecma International начала разработку стандартного теста для Ecma 262 ECMAScript. Test262 - это набор тестов соответствия ECMAScript, который можно использовать для проверки того, насколько близко реализация JavaScript соответствует спецификации ECMAScript. Набор тестов содержит тысячи отдельных тестов, каждый из которых проверяет некоторые конкретные требования спецификации ECMAScript. Разработка Test262 является проектом Технического комитета Ecma 39 (TC39). Структура тестирования и отдельные тесты создаются организациями-членами TC39 и вносятся в Ecma для использования в Test262.

Важный вклад внесли Google (Sputnik testsuite) и Microsoft, которые провели тысячи тестов. Test262 testsuite состоял из 38 014 тестов по состоянию на январь 2020 года. Спецификации ECMAScript через ES7 хорошо поддерживаются в основных веб-браузерах. В таблице ниже показана степень соответствия текущих версий программного обеспечения самым последним редакциям ECMAScript.

Соответствие скриптового движка

См. Также[править]

Пруф[править]

Стандарты ISO

.iso.org/standard/73002.html

Стандарты ECMA

.ecma-international.org/publications-and-standards/standards/ecma-262/

[[]]