12-е издание ECMAScript планируется утвердить в июне 2021 года Генеральной ассамблеей ECMA. И к этому времени уже почти ясно, какие будущие функции войдут в стандартную спецификацию.

В этой статье перечислены будущие функции JavaScript, которые определенно упростят разработку.

String.prototype.replaceAll ()

В настоящее время мы можем заменить все вхождения строки на другое значение, используя String.prototype.replace() и передавая регулярное выражение с глобальным флагом.

ES2021 поднимает это на новый уровень, вводя String.prototype.replaceAll(), который избавляет нас от необходимости использовать регулярные выражения.

Мы все еще можем использовать регулярные выражения с replaceAll(). Итак, что произойдет, если мы попытаемся передать регулярное выражение без глобального флага в replaceAll()?

Мы не можем. Спецификация фактически разрешает использование replaceAll() только с глобальными регулярными выражениями и выдает TypeError, если мы этого не делаем. Тем не менее, это отличное дополнение к стандартной спецификации.

Promise.any ()

Promise.any() - это полная противоположность Promise.all(). Он берет список обещаний и возвращает одно обещание. Это единственное обещание преобразуется в значение первого обещания, которое разрешается из этого списка.

В приведенном выше примере вызов Promise.any() разрешился на 42, потому что promise4 разрешился немедленно.

Однако, когда все обещания, переданные в Promise.any(), терпят неудачу или отклоняются, возвращенное единственное обещание будет отклонено с AggregateError - новым типом Error, представляющим сразу несколько ошибок.

AggregateError

AggregateError по своему названию представляет собой совокупность нескольких выданных ошибок. Возвращаясь к Promise.any(), если он отклоняет все обещания, возвращенное обещание отклоняет AggregateError, как показано в примере ниже.

Вы даже можете поэкспериментировать с AggregateErrors и использовать их в своих формах.

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

Операторы логического присваивания

Далее идут новые операторы логического присваивания ??=, &&= и ||=. Эти три в значительной степени говорят сами за себя, но все же вот несколько примеров.

Нулевое присвоение (??=)

В приведенном выше примере оператор присваивания с нулевым значением в основном указывает компилятору присвоить значение y x, если x равно null или undefined. В противном случае верните существующее значение x.

И присвоение (&& =)

Здесь оператор присваивания &&= сообщает компилятору, что если x имеет истинное значение, замените его значением y.

ИЛИ Присвоение (|| =)

С другой стороны, оператор присваивания ||= проверяет ложное значение и затем выполняет присваивание.

WeakRef

Если у вас есть опыт работы с Objective-C, это должно показаться вам очень знакомым. И, как вы угадали, он обозначает слабые ссылки и используется для управления сборкой мусора.

Объект WeakRef содержит ссылку на объект, но позволяет уничтожить этот объект или освободить выделенную им память сборщиком мусора движка JavaScript. Это идет рука об руку со следующей функцией в этом списке, FinalizationRegistry.

Доработка

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

Чтобы создать его, мы создаем экземпляр FinalizationRegistry и передаем функцию обратного вызова.

Затем мы регистрируем объекты, для которых мы хотим иметь обратный вызов очистки и «удерживаемое значение» для него. Это удерживаемое значение используется для представления объекта при его очистке.

⚠️ Предупреждение о WeakRef и FinalizationRegistry

И WeakRef, и FinalizationRegistry возятся со сборкой мусора, что является очень сложной темой. Различные движки JavaScript могут делать что-то по-разному или даже отличаться в зависимости от версии. Поэтому, хотя использование этих новых функций может быть действительно интересно, по возможности их следует избегать.

Числовой буквенный разделитель

И последнее в нашем списке - это возможность использовать символы подчеркивания в качестве разделителя числовых литералов. ES2021 добавляет поддержку символа _, который будет использоваться в качестве разделителя для чисел, поэтому 9999999 можно записать как 9_999_999 для лучшей читаемости.

С этим дополнением вам больше не нужно прищуриваться, чтобы считать количество нулей или девяток в числовом литерале. Довольно удобно, правда? 😉

И это все. ES2021 / ES12 не за горами, и я надеюсь, что вы будете рады использовать эти новые функции в своих проектах. Увидимся снова в следующем обновлении!

Не забывайте аплодировать и подписаться на меня, чтобы увидеть больше подобных статей.