От автора: по мере эволюции языков программирования развитие JavaScript в последние несколько лет было безумным. Теперь каждый год выходит новая версия спецификации ECMAScript, и легко запутаться в версиях JavaScript, какая версия поддерживает то, и как вы можете защитить свой код в будущем.
Чтобы лучше понять, как и почему за этим, казалось бы, постоянным потоком новых функций, давайте кратко рассмотрим историю JavaScript ES6 и других его версий, а также выясним, почему процесс стандартизации так важен.
Ранняя история JavaScript-версий
Прототип JavaScript был написан всего за десять дней в мае 1995 года Бренданом Эйхом. Первоначально он был завербован для внедрения среды выполнения Scheme для Netscape Navigator, но команда управления настояла на языке C-стиля, который будет дополнять недавно выпущенную Java.
JavaScript дебютировал в версии 2 Netscape Navigator в декабре 1995 года. В следующем году Microsoft провела реверс инжиниринг JavaScript для создания собственной версии, назвав его JScript. JScript поставляется с версией 3 браузера Internet Explorer и почти идентичен JavaScript — даже включая все те же ошибки и причуды — но у него были некоторые дополнительные возможности Internet Explorer.
Рождение ECMAScript
Необходимость обеспечения того, чтобы JScript (и любые другие варианты) оставались совместимыми с JavaScript, мотивировала Netscape и Sun Microsystems к стандартизации языка. Они сделали это с помощью Европейской ассоциации производителей компьютеров, которая принимает стандарты. Стандартизованный язык назывался ECMAScript, чтобы не нарушать товарный знак Sun’s Java — шаг, вызвавший путаницу. В конечном итоге ECMAScript использовался для обозначения спецификации, и JavaScript был (и до сих пор) использован для обозначения самого языка.
Рабочая группа по управлению версиями JavaScript и поддержанию ECMAScript известна как Технический комитет 39 или TC39. В его состав входят представители всех крупных поставщиков браузеров, таких как Apple, Google, Microsoft и Mozilla, а также приглашенные эксперты и делегаты из других компаний, заинтересованных в развитии Интернета. Они проводят регулярные встречи, чтобы определить, как будет развиваться язык.
Когда JavaScript был стандартизован TC39 в 1997 году, спецификация была известна как ECMAScript версии 1. Последующие версии ECMAScript были изначально выпущены на ежегодной основе, но в конечном итоге стали спорадическими из-за отсутствия консенсуса и неуправляемо большого набора функций, окружающего ECMAScript 4. Таким образом, эта версия была прервана и сокращена до 3.1, но не была доработана под этим прозвищем, а в конечном итоге превратилась в ECMAScript 5. Это было выпущено в декабре 2009 года, через 10 лет после ECMAScript 3, и представила API-интерфейс сериализации JSON, Function.prototype. bind и строгий режим, среди других возможностей. Спустя два года был выпущен релиз технического обслуживания для уточнения некоторой неоднозначности последней итерации 5.1.
ECMAScript 2015 и возрождение ежегодных релизов
С разрешением разногласий TC39, вытекающих из ECMAScript 4, Брендан Эйч подчеркнул необходимость в ближайших меньших релизах. Первой из этих новых спецификаций был ES2015 (первоначально называвшийся ECMAScript 6 или ES6). Это издание было большой, но необходимой основой для поддержки будущего, годового управления версиями JavaScript. Он включает в себя множество функций, которые сегодня любят многие разработчики, такие как:
Классы
Promises
Стрелочные функции
Модули ES
Генераторы и итераторы
ES2015 был первым предложением следовать процессу TC39, основанной на предложениях модели для обсуждения и принятия элементов.
Процесс TC39
Есть пять этапов, через которые должно пройти предложение, прежде чем оно может быть принято в предстоящую версию ECMAScript.
Этап 0: Strawman
Это удобный шаг, позволяющий представить идеи спецификации. Возможности могут предлагаться кем угодно, а именно членами TC39 и нечленом, зарегистрировавшимся в качестве участника.
Этап 1: Предложение
Первый этап, на котором формализуется предложение. Необходимо, чтобы:
Были описаны все существующие проблемы, исправленные решением
Был предоставлен контур API, наряду с деталями реализации высокого уровня, а также полифилами и / или демонстрационными версиями
потенциальные препятствия обсуждаются заранее.
Чтобы принять и продвинуть предложение, необходимо выбрать чемпиона. Этот человек должен быть членом TC39.
Этап 2: Черновик
Это веха, в которой функция, вероятно, будет включена в будущую версию ECMAScript. Здесь синтаксис и семантика предложения подробно описываются с использованием формального языка, описанного в спецификации. На данный момент должна быть представлена экспериментальная реализация.
Этап 3: Кандидат
Здесь большая часть предложения и технология поддержки были разработаны, но для этого требуется дополнительная обратная связь от пользователей и разработчиков (таких как поставщики браузеров). После того, как это доступно и будет действовать, детали спецификации завершаются и подписываются назначенными рецензентами и назначенным редактором. Поскольку на данном этапе требуется соответствующая реализация, впредь принимаются только критические изменения.
Этап 4: закончен
Это предложение было принято и может быть добавлено в ECMAScript. Поэтому присуще:
приемочные испытания, которые являются частью набора Test262 и созданы с использованием JavaScript, были написаны для подтверждения соответствия и поведения функции
доступны, по крайней мере, две совместимые реализации и отправлены, все из которых демонстрируют надежность и удобство использования
pull запрос был отправлен на официальный репозиторий ECMA-262 и был подписан редактором спецификаций.
В приведенном выше документе вклада репозитория подробно описывается использование проблем GitHub и pull запрос на управление дополнениями к языку.
Движение вперед
После завершения ES2015 и создания TC39-процесса по версированию и обновлению JavaScript последующие выпуски проходили каждый июнь с включением предложений, которые были отведены на один год. На момент написания статьи было три новые спецификации.
ES2016
Также известный как ES7, это была первая меньшая, инкрементная версия ECMAScript. Помимо исправлений ошибок, он добавил только две функции.
Array.prototype.includes
Этот метод экземпляра упрощает поиск значений в Array:
1 2 3 4 5 |
// pre-ES2016: const hasBob = names.indexOf('bob') > -1; // ES2016: const hasBob = names.includes('bob'); |
Оператор экспоненты
До ES2016 можно было выполнить возведение в степень с помощью Math.pow(base, exponent) . Эта версия вводит оператор (**), который имеет свой собственный приоритет:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// pre-ES2016 Math.pow(5, 3); // => 125 // ES2016 5 ** 3; // => 125 [ /JS] <h3>ES2017</h3> <p>Немного больший выпуск ES2017 (aka ES8) содержит несколько полезных методов и синтаксических конструкций. </p> <h3>Асинхронные функции</h3> <p>Promises избавили нас от аддонов обратного вызова, но их API, тем не менее, демонстрирует многословие. Асинхронные функции абстрагируют их синтаксисом, который очень напоминает синхронный код: </p> <pre class="lang:JS"> // promises const getProfile = name => { return fetch(`//some-api/people/${name}`) .then(res => res.json()) .then(({ profile }) => profile); // destructuring `profile` from parsed object }; // async/await const getProfile = async name => { const res = await fetch(`//some-api/people/${name}`); const { profile } = await res.json(); return profile; }; |
Методы заполнения строк
String.prototype.padStart (длина, padder) и padEnd (длина, padder) будут соответственно дополнять и добавлять padder (это необязательно, по padder пробел) до строки до тех пор, пока он не достигнет символов length:
1 2 3 4 |
'foo'.padStart(6); // => ' foo'; 'foo'.padEnd(6); // => 'foo '; 'foo'.padStart(10, 'bar'); // => 'barbarbfoo'; 'foo'.padEnd(10, 'bar'); // => 'foobarbarb'; |
Другие функции включают запятые, разделяемую память и атомику, а также статические методы Object ( Object.entries () , Object.values () и Object.getOwnPropertyDescriptors () .)
ES2018
Эта последняя итерация на момент написания статьи представляет собой небольшой набор мощных дополнений.
Асинхронные итераторы
Хотя Promise.all() позволяет вам ждать разрешения нескольких обещаний, есть случаи, когда вам может потребоваться последовательная итерация по асинхронно полученным значениям. Теперь можно ожидать асинхронных итераторов вместе с массивами promises:
1 2 3 4 5 6 7 8 9 |
(async () => { const personRequests = ['bob', 'sarah', 'laura'].map( n => fetch(`//api/people/${n}`) ); for await (const response of personRequests) { console.log(await response.json()); } })(); |
Свойства объекта spread и rest
Очевидно, эти два синтаксических улучшения уже популярны среди разработчиков JavaScript благодаря наличию компиляторов, таких как Babel. Свойства объекта и свойства останова аналогичны свойствам распространения и останова массива и позволяют мелко копировать и сгруппировать деструктурирование свойств объекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const react = { name: 'React', vendor: 'Facebook', description: 'A JavaScript library for building user interfaces', npm: true, cdn: true, }; /* Use spread syntax inside an object literal to create * a shallow copy, while overriding certain properties. */ const vue = { ...react, vendor: 'Evan You', description: 'A JavaScript framework for building UIs', }; /* Use rest within destructuring syntax to create a * label for accessing additional object properties. */ const { name, vendor, ...rest } = vue; console.log(rest.description); // => 'A JavaScript framework for building UIs' |
Другими принятыми предложениями являются Promise.prototype.finally (), а также улучшения регулярных выражений и шаблонных литералов.
Заключительное слово
JavaScript значительно расширился за короткий промежуток времени. Хотя это объясняется стандартом ECMAScript и блестящей работой TC39, это изначально было трудным путешествием из-за предыдущего отсутствия стабильности и сплоченности при версировании и разработке JavaScript.
Благодаря процессу относительно зрелых предложений язык может только улучшиться прагматичным и управляемым образом. Хорошее время для того, чтобы стать веб-разработчиком!
Автор: James Wright
Источник: //www.sitepoint.com/
Редакция: Команда webformyself.