На этой неделе был выпущен 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