Обзор новых спецификаций ES13

Наконец-то опубликованы новые спецификации ES13. Спецификации? JavaScript действительно не является языком с открытым исходным кодом. Это язык, написанный в соответствии со стандартными спецификациями ECMAScript. Комитет TC39 отвечает за обсуждение и утверждение новых функций. Кто они?

TC39 ECMA International — это группа разработчиков JavaScript, специалистов по внедрению, ученых и других специалистов, которые сотрудничают с сообществом для поддержки и развития определения JavaScript. — TC39.es

Процесс их выпуска состоит из пяти этапов. С 2015 года они выпускают ежегодные релизы. Обычно они случаются весной.

Существует два способа обращения к любой версии ECMAScript:

  • По году: этот новый релиз будет ES2022.
  • По номеру итерации: этот новый выпуск будет 13-й итерацией, поэтому его можно обозначить как ES13.

Итак, что же нового в этом релизе? Какими функциями мы можем восхищаться?

Индексы совпадения регулярных выражений

В настоящее время при использовании JavaScript Regex API в JavaScript возвращается только start index совпадения. Однако этого недостаточно для некоторых специальных расширенных сценариев.

В рамках этих спецификаций был добавлен специальный флаг d. Используя его, API регулярных выражений вернет двумерный массив в качестве ключа с именем indices. Он содержит индексы start и end для каждого совпадения. Если бы в регулярном выражении была захвачена какая-либо именованная группа, она вернула бы их индексы начала/конца в объекте indices.groups. Имя именованной группы будет ее ключом.

Смотрите оригинальное предложение здесь.

Верхний уровень await

До этого предложения было не принято иметь top level awaits. Были некоторые обходные пути для имитации поведения, но у всех были свои недостатки.

Функция ожидания верхнего уровня позволяет нам полагаться на модуль для обработки этих промисов. Это интуитивно понятная функция. Однако обратите внимание, что это может изменить порядок выполнения модулей. Если один модуль зависит от другого, у которого есть вызов await верхнего уровня, выполнение этого модуля будет остановлено до тех пор, пока обещание не будет выполнено.

Давайте посмотрим на пример:

В приведенном выше примере движок будет ждать выполнения users перед выполнением кода в модуле usage.js.

Таким образом, это приятная и интуитивно понятная функция, которую нужно использовать с осторожностью. Мы не хотим злоупотреблять этим.

Смотрите оригинальное предложение здесь.

.at()

В течение долгого времени в JavaScript поступали запросы на предоставление Python подобного метода доступа к массиву с отрицательным индексом. Вместо того, чтобы делать array[array.length-1], делать просто array[-1]. Это просто невозможно, потому что нотация [] также используется для объектов в JavaScript.

Принятые предложения имеют более практический подход. Объект Array теперь будет иметь метод at, который будет имитировать описанное выше поведение.

Смотрите оригинальное предложение здесь.

Кстати, теперь, когда мы говорим о массивах, знаете ли вы, что можете деконструировать позицию массива? 👌

Доступно Object.prototype.hasOwnProperty

Следующее просто приятно иметь упрощение. Уже есть hasOwnProperty. Однако его нужно вызывать внутри экземпляра поиска, который мы хотим выполнить. Поэтому многие разработчики часто заканчивали так:

С этими новыми спецификациями к прототипу Object был добавлен метод hasOwn. Теперь мы можем просто сделать:

Смотрите оригинальное предложение здесь.

Ошибка Причина

Ошибки помогают нам идентифицировать и реагировать на неожиданное поведение нашего приложения. Однако понять основную причину глубоко вложенных ошибок или даже правильно их обработать может оказаться непросто. Мы теряем информацию о трассировке стека при их перехвате и повторном выбрасывании.

Не было четкого соглашения о том, как с этим справиться. Учитывая любую обработку ошибок, у нас есть как минимум 3 варианта:

В рамках этих новых спецификаций мы можем создать новую ошибку и сохранить ссылку на обнаруженную ошибку. Как? Просто передав объект {cause: err} конструктору Error.

Все становится проще, стандартнее и проще для понимания глубоко вложенных ошибок. Давайте посмотрим на пример:

Подробнее о предложении можно узнать здесь.

Поля класса

До этого релиза не было надлежащего способа создания приватных полей. Было несколько способов обойти это с помощью подъема, но это не было настоящим частным полем. Теперь это просто. Нам просто нужно добавить символ # к объявлению нашей переменной.

Наличие приватных полей означает, что у нас есть сильная граница инкапсуляции. Доступ к переменной класса извне невозможен. Это демонстрирует, что ключевое слово class больше не является просто синтаксисом сахара.

Мы также можем создавать частные методы:

Эта функция связана с Class Static Block и Ergonomic checks for Private Classes, которые мы увидим ниже.

Подробнее о предложении можно узнать здесь.

Статический блок класса

В рамках новых спецификаций теперь мы можем включать static blocks в любой Class. Они запускаются только один раз и являются отличным способом украсить или выполнить некоторую инициализацию для каждого поля статической стороны класса.

Мы не ограничиваемся использованием одного блока, мы можем иметь столько, сколько нам нужно.

У них есть приятный бонус. Они получают привилегированный доступ к private fields. Вы можете использовать их, чтобы сделать некоторые интересные узоры.

Если бы мы попытались получить доступ к этой частной переменной из внешней области объекта экземпляра, мы бы получили Cannot read private member #privateField from an object whose class did not declare it.

Подробнее о предложении можно узнать здесь.

Эргономичные фирменные чеки для частных полей

Новые поля private — отличная функция. Однако может оказаться удобным проверить, является ли поле private или нет в некоторых static методах.

Попытка вызвать этот in вне области действия класса приведет к той же ошибке, которую мы видели ранее.

Подробнее о предложении можно узнать здесь.

Последние мысли

Это интересный выпуск, который предоставляет множество небольших полезных функций, таких как at, private fields и error cause. Конечно, error cause внесет ясность в наши ежедневные задачи по отслеживанию ошибок.

Некоторые расширенные функции, такие как top-level await, необходимо хорошо понимать перед их использованием. Они могут иметь нежелательный побочный эффект при выполнении вашего кода.

Я надеюсь, что эта статья взволновала вас новыми спецификациями ES2022 так же, как и меня.