Что касается языков программирования, то разработка JavaScript в последние несколько лет была безумно позитивной. Теперь, когда каждый год появляется новая версия спецификации ECMAScript, легко запутаться в версии JavaScript, какая версия поддерживает, и как вы можете защитить свой код в будущем.
Чтобы лучше понять, как и почему за этим, казалось бы, постоянным потоком новых функций, давайте кратко рассмотрим историю создания версий JavaScript и JavaScript и выясним, почему процесс стандартизации так важен.
Ранняя история версий JavaScript
Прототип JavaScript был написан всего за десять дней в мае 1995 года Бренданом Айхом. Первоначально он был нанят для реализации среды выполнения Scheme для Netscape Navigator, но команда менеджеров настаивала на языке C-стиля, который дополнил бы недавно выпущенную Java.
JavaScript дебютировал во второй версии Netscape Navigator в декабре 1995 года. В следующем году Microsoft реорганизовала JavaScript для создания собственной версии, назвав ее JScript. JScript поставлялся с версией 3 браузера Internet Explorer и был почти идентичен JavaScript — даже включая все те же ошибки и измышления — но у него были некоторые дополнительные функции только для Internet Explorer.
Рождение ECMAScript
Необходимость обеспечения совместимости JScript (и любых других вариантов) с JavaScript побудила Netscape и Sun Microsystems к стандартизации языка. Они сделали это с помощью Европейской ассоциации производителей компьютеров , которая будет принимать стандарт. Стандартизированный язык назывался ECMAScript, чтобы избежать посягательства на торговую марку Sun Java — шаг, который вызвал значительную путаницу. В конечном итоге ECMAScript использовался для ссылки на спецификацию, а JavaScript использовался (и до сих пор используется) для ссылки на сам язык.
Рабочая группа, отвечающая за управление версиями JavaScript и поддержку ECMAScript, известна как Технический комитет 39 или TC39. Он состоит из представителей всех основных производителей браузеров, таких как Apple, Google, Microsoft и Mozilla, а также приглашенных экспертов и делегатов из других компаний, заинтересованных в развитии Интернета. Они регулярно встречаются, чтобы решить, как будет развиваться язык.
Когда JavaScript был стандартизирован TC39 в 1997 году, спецификация была известна как ECMAScript version 1. Последующие версии ECMAScript первоначально выпускались на ежегодной основе, но в конечном итоге стали спорадическими из-за отсутствия консенсуса и неуправляемо большого набора функций, окружающих ECMAScript 4. Таким образом, эта версия была прервана и сокращена до версии 3.1, но не была завершена под этим прозвищем, а в конечном итоге превратилась в ECMAScript 5. Она была выпущена в декабре 2009 года, через 10 лет после ECMAScript 3, и представила API сериализации JSON Function.prototype. bind , и строгий режим , среди других возможностей. Вспомогательный выпуск, чтобы прояснить некоторую двусмысленность последней итерации, 5.1, был выпущен два года спустя.
Хотите глубже погрузиться в историю JavaScript? Тогда ознакомьтесь с первой главой JavaScript: от новичка до ниндзя, 2-е издание
ECMAScript 2015 и возрождение ежегодных выпусков
С разрешением разногласий TC39, возникших в результате ECMAScript 4, Брендан Айх подчеркнул необходимость более мелких выпусков в ближайшей перспективе. Первой из этих новых спецификаций была ES2015 (первоначально называемая ECMAScript 6 или ES6). Это издание было большой, но необходимой основой для поддержки будущих ежегодных версий JavaScript. Он включает в себя множество функций, которые сегодня любят многие разработчики, такие как:
ES2015 был первым предложением, последовавшим за процессом TC39 , моделью на основе предложений для обсуждения и принятия элементов.
Процесс TC39
Есть пять этапов, через которые предложение должно пройти, прежде чем оно может быть принято в следующей версии ECMAScript.
Этап 0: Строумэн
Это удобный шаг, чтобы разрешить представление идей в спецификации. Функции могут быть предложены кем угодно — а именно, членами TC39 и нечленами, которые зарегистрировались в качестве участника.
Этап 1: Предложение
Первый этап, на котором предложение оформляется. Необходимо, чтобы:
- любые существующие проблемы, исправленные решением
- предоставляется схема API, а также подробности реализации высокого уровня, а также полифилы и / или демонстрации
- потенциальные препятствия обсуждаются заранее.
Чемпион должен быть выбран, чтобы принять и продвинуть предложение. Этот человек должен быть членом TC39.
Этап 2: Черновик
Это этап, на котором функция, вероятно, будет включена в будущую версию ECMAScript. Здесь синтаксис и семантика предложения детализированы с использованием формального языка, описанного в спецификации. На этом этапе должна быть доступна экспериментальная реализация.
Этап 3: Кандидат
Здесь большинство предложений и технология поддержки были разработаны, но это требует дополнительной обратной связи от пользователей и разработчиков (таких как поставщики браузеров). После того, как это будет доступно и выполнено, подробности схемы и спецификации будут доработаны и подписаны назначенными рецензентами и назначенным редактором. Поскольку на данном этапе требуется совместимая реализация, отныне принимаются только критические изменения.
Этап 4: Закончено
Предложение принято и может быть добавлено в ECMAScript. Таким образом, присуще следующее:
- Приемочные тесты, которые являются частью пакета Test262 и выполнены с использованием JavaScript, были написаны для подтверждения соответствия и поведения функции.
- по крайней мере, две совместимые реализации доступны и поставлены, все из которых демонстрируют надежность и удобство использования разработчиком
- запрос на извлечение был отправлен официальному репозиторию ECMA-262 , который был подписан редактором спецификации.
Вкладной документ вышеупомянутого репозитория более детально описывает использование проблем GitHub и запросы на извлечение для управления дополнениями к языку.
Движение вперед
После завершения ES2015 и создания в TC39 процесса управления версиями и обновлениями JavaScript последующие выпуски происходили каждый июнь, с включением предложений, рассчитанных на один год. На момент написания статьи было три новых спецификации.
ES2016
Также известный как ES7, это была первая уменьшенная инкрементная версия ECMAScript. Помимо исправлений ошибок, он добавил только две функции.
Array.prototype.includes
Этот метод экземпляра упрощает поиск значений в Array
:
// pre-ES2016: const hasBob = names.indexOf('bob') > -1; // ES2016: const hasBob = names.includes('bob');
Экспонент Оператор
До ES2016 можно было возвести степень в степень с помощью Math.pow(base, exponent)
. В этой версии представлен оператор (**), который имеет собственный приоритет:
// pre-ES2016 Math.pow(5, 3); // => 125 // ES2016 5 ** 3; // => 125
ES2017
Немного больший выпуск ES2017 (он же ES8) содержит несколько полезных методов и синтаксических конструкций.
Асинхронные функции
Обещания спасли нас от ада обратного вызова, но их API, тем не менее, демонстрирует многословие. Асинхронные функции абстрагируют их с помощью синтаксиса, который очень похож на синхронный код:
// promises const getProfile = name => { return fetch(`https://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(`https://some-api/people/${name}`); const { profile } = await res.json(); return profile; };
Методы заполнения строк
String.prototype.padStart (length, padder) и padEnd (length, padder) будут соответственно дописывать и добавлять padder
(это необязательно, по padder
пробел) к строке несколько раз, пока она не достигнет length
символов:
'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 () .)
Если вы хотите узнать больше о полном наборе функций ES2017, ознакомьтесь с нашей статьей, рассказывающей о новых возможностях ES2017 .
ES2018
Эта последняя итерация, на момент написания, представляет небольшой набор мощных дополнений.
Асинхронные итераторы
Хотя Promise.all()
позволяет вам ожидать разрешения нескольких обещаний, в некоторых случаях вам может потребоваться последовательно выполнить итерацию по асинхронно полученным значениям. Теперь можно ожидать асинхронных итераторов вместе с массивами обещаний:
(async () => { const personRequests = ['bob', 'sarah', 'laura'].map( n => fetch(`https://api/people/${n}`) ); for await (const response of personRequests) { console.log(await response.json()); } })();
Свойства распространения и отдыха объектов
Якобы, эти два синтаксических улучшения уже популярны среди разработчиков JavaScript благодаря наличию таких компиляторов, как Babel . Свойства распространения и отдыха объекта аналогичны свойствам распространения и отдыха массива и допускают поверхностное копирование и групповую деструктуризацию свойств объекта:
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 () , а также улучшения регулярных выражений и литералов шаблонов .
Если вы хотите узнать больше о полном наборе функций ES2018, ознакомьтесь с нашей статьей, посвященной новинкам ES2018 .
Последнее слово
JavaScript значительно развился за короткий промежуток времени. Хотя это объясняется стандартом ECMAScript и блестящей работой TC39, изначально это был трудный путь из-за предыдущего отсутствия стабильности и согласованности в версиях и разработке JavaScript.
Благодаря относительно зрелому процессу подачи предложений, язык может улучшаться только прагматичным и управляемым образом. Это прекрасное время для веб-разработчика!