Следить за всеми спецификациями ECMAScript — непростая задача из-за их постоянных обновлений, здесь мы подытожили основные моменты ES11.

Javascript получает новые обновления каждый год, и каждый год в спецификации JS появляется ряд функций. Затем браузерам, Node.js и т. д. требуется некоторое время, чтобы их внедрить, и, прежде чем вы это заметите, появится большая куча новых функций JavaScript, которые вы, возможно, потеряли.

Имея такой быстрый цикл обновления, мы собрали функции ES11 (ECMAScript 11), которые вы могли пропустить. Они включают в себя некоторые эргономические и другие современные улучшения. Давайте взглянем.

Необязательная цепочка

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

Необязательная цепочка работает для простых случаев, таких как данные вложенных объектов, для функций, возвращающих несуществующие значения, и даже для функций, которые не существуют как методы-члены объектов.

Код более краток в выражении того, что вы хотите: если вещь существует, перейдите к ней; если нет, вернуть undefined.

globalЭта функция

globalThis — это абстракция глобального объекта, доступного для текущего контекста. Наиболее известным и древним из них является объект окна, который можно найти в JavaScript, работающем в браузере. Но такие среды, как Node.js и веб-воркеры, имеют свои собственные корневые объекты, которые служат точно той же цели: глобальные и собственные, соответственно.

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

Это пример кода для создания полифилла.

BigInt

До ES11 самым большим целым числом, на которое можно было безопасно ссылаться в JavaScript, было Number.MAX_SAFE_INTEGER, которое разрешается в 9007199254740991 (он же 2⁵³ — 1). Это может быть не ежедневной проблемой для опытных разработчиков, но для многих приложений это забавно крошечная величина, требующая от программистов использования оболочки, такой как big-integer.

При использовании традиционного типа Number для представления таких больших чисел вы столкнетесь с неожиданным округлением. (Обратите внимание, что все эти комментарии применимы и к очень маленьким числам, то есть -2⁵³ — 1).

В ES11 для этих сценариев встроен тип BigInt. Вы можете определить его, добавив n в конце числа, например, mySafeBigNumber = 9007199254740992n.

Это действительно новый тип, а не просто ловкость рук существующего типа Number. Если вы сделаете typeof 12, вы получите число. Если вы сделаете typeof myBigNumber, вы получите bigInt, но если вы попробуете что-то гнусное вроде myBigNumber — 12, вы получите ошибку: «Невозможно смешивать BigInt и другие типы, используйте явные преобразования».

BigInt также поддерживает представление в двоичной, восьмеричной и шестнадцатеричной нотации и поддерживает все типичные математические операторы, которые вы можете ожидать, за исключением унарного оператора плюс, целью которого является преобразование значения в число. Причина этого довольно неясна, чтобы избежать критических изменений в существующем ассемблерном коде, отличном от JS.

Нулевое слияние

Nullish Coalescing присоединяется к необязательным цепочкам, помогающим нам в работе с нулевыми значениями, а также к новому символу, двойному вопросительному знаку ??. Это логический оператор с поведением, аналогичным логическому оператору ИЛИ ||.

Разница между ?? и || заключается в том, как оператор обрабатывает нулевые значения по сравнению с ложными. Большинство разработчиков JavaScript знакомы с тем, как язык обрабатывает нелогические значения при проверке их на истинность/ложь. Для лучшей оптики это false, 0, null, пустые строки и undefined считаются ложными, а все остальное разрешается как true.

Давайте посмотрим на пример того, как работает нулевое объединение.

Динамический импорт

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

Обещание.allSettled()

Метод promise.allSettled() позволяет вам наблюдать за результатами набора обещаний, независимо от того, выполнены они или отклонены. Это можно противопоставить promise.all(), который завершится отклоненным обещанием или ошибкой без обещания. promise.allSettled() возвращает массив объектов, описывающих результаты каждого промиса.

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

Лямбда-вызов в этом случае не срабатывает. Вместо этого выполняется предложение then, и возвращается массив с содержимым ключ:значение. Ключевым выводом здесь является то, что третье обещание выполнено, и мы можем видеть его результат, даже несмотря на то, что обещание2 не удалось до него.

Экспорт звездообразного синтаксиса

Эта функция добавляет возможность экспортировать *(синтаксис Star) из модуля. Вы уже могли импортировать * из другого модуля, но теперь вы можете экспортировать с помощью той же команды

Это своего рода цепочка модулей, позволяющая вам экспортировать все из другого модуля из текущего модуля, что очень полезно, например, если вы создаете модуль, который объединяет другие модули в свой API.

Постоянно обновляемая спецификация

Когда вы работаете в технологической отрасли, вы, несомненно, столкнетесь с постоянной эволюцией вещей. Языки программирования являются одним из наиболее фундаментальных выражений из всех, где большая часть философии компьютерных наук встречается с реальностью повседневного кодирования. С ES11 JS продолжает расти в ответ на эти силы с его ежегодным графиком выпуска.