На этой неделе был выпущен Node.js v14.0, ставший текущим выпуском. Это означает, что через шесть месяцев, к концу октября 2020 года, он будет переведен в статус Активная LTS (долгосрочная поддержка) и будет готов к общему использованию.

Node.js v14.0.0 был обновлен для использования V8 8.1, который обеспечивает поддержку последних функций JS. В этой статье я хотел бы подвести итоги этих интересных функций.

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

Если вы разработчик JS, вы, вероятно, столкнулись с кодом, в котором вам нужно проверить, имеет ли свойство объекта значение null или undefined, прежде чем обращаться к нему, как в следующем коде:

if(user && user.details) {
  const name = user.details.name
}

Этот тип кода не является декларативным и очень подвержен ошибкам - я почти уверен, что вы уже знакомы с ошибкой Невозможно прочитать свойство 'xxx' из undefined.
Это также имеет (нежелательное) последствие проверки всех истинных значений вместо проверки только ненулевых значений.

V8 версии 8.0 представила Optional Chaining и его оператор ?., поэтому приведенный выше код можно переписать так:

const name = user?.details?.name

Что произойдет, если пользователь или детали не определены? JavaScript инициализирует name как undefined вместо выдачи ошибки.

Другие варианты использования, в которых может пригодиться оператор Optional Chaining:

// user.details is deleted only if user is defined
delete user?.details
// Use operator ?.() to call optional methods
const adminOption = user?.prefs?.getPrefs?.().option
// Use operator ?.[] to access dynamic properties
const rolesCount = user?.preferences?.['roles'].length
// If usersArray is null or undefined then name will be undefined
const userIndex = 5
const name = usersArray?.[userIndex].name

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

Распространенным шаблоном в Javascript является использование символа || для установки значений по умолчанию, как в примере ниже:

function convertUser(user) {
  const isActive = user.active || true
}

Но что произойдет, если user.active ложно? Тогда переменная isActive по-прежнему будет иметь значение true, что, вероятно, вызовет неожиданное поведение в нашем коде.

V8 версии 8.0 предоставляет нам оператор нулевого объединения ??, который можно использовать вместо || чтобы исправить вышеуказанную ошибку:

const isActive = user.active ?? true

isActive будет истинным, если user.active имеет значение null или undefined, но будет ложным, если user. активный - ложный.

Дополнительное объединение + нулевое объединение

Nullish Coalescing можно использовать для установки значения по умолчанию при использовании дополнительной цепочки. В приведенном ниже примере name будет unknown, если пользовательский объект не имеет свойства name внутри details.

const name = user?.details?.name ?? 'unknown'

Последние две функции относятся к модулю Intl.

Объект Intl - это пространство имен для ECMAScript Internationalization API, которое обеспечивает чувствительное к языку сравнение строк, форматирование чисел и форматирование даты и времени.

Intl.DisplayNames

Новый API Intl.DisplayNames позволяет нам получать переводы названий языков, валют и регионов на разные языки. Например, предположим, что нам нужны названия регионов на испанском языке, мы можем использовать следующий код:

const regionNames = new Intl.DisplayNames(['es'], {type: 'region'})
regionNames.of('FR') // 'Francia'
regionNames.of('US') // 'Estados Unidos'

Или, если мы хотим получить названия языков на французском:

const langNames = new Intl.DisplayNames(['fr'], {type: 'language'})
langNames.of('ES') // 'espagnol'
langNames.of('EN') // 'anglais'

И, наконец, давайте посмотрим на пример получения названий валют на упрощенном китайском:

const currencyNames = new Intl.DisplayNames(['zh-Hans'], {type: 'currency'});
currencyNames.of('USD') // '美元'
currencyNames.of('EUR') // '欧元'

Параметры Intl.DateTimeFormat

API Intl.DateTimeFormat используется для работы с языковым форматированием даты и времени. Например:

const date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0))
// British English uses day-month-year order
console.log(new Intl.DateTimeFormat('en-GB').format(date))
// "19/12/2012"

Форматы даты и времени можно настроить с помощью аргумента options в конструкторе DateTimeFormat.

Этот API не является новым и был добавлен в V8 в прошлом, но теперь он поддерживает параметры calendar и numberingSystem:

const options = {calendar: 'chinese', numberingSystem: 'arab'}
const dateFormat = new Intl.DateTimeFormat('default', options)

Все вышеперечисленные функции по умолчанию поставляются с Node.js v14.0. Также версия включает в себя другие функции, не связанные с V8, о которых вы можете прочитать в примечаниях к выпуску. Я, наверное, напишу о них больше в ближайшие месяцы.

Спасибо за прочтение! Надеюсь, вам понравилась эта статья. Дайте мне знать, если у вас есть какие-либо комментарии или отзывы.

Следите за новостями, чтобы увидеть больше статей о Node.js и подписаться на меня в Twitter https://twitter.com/sebcurland