Node.js v14: nuevas características

Node.js v14: nuevas características

El 22 de abril se lanzó la versión 14.0 de Node.js, pasando a ser la release actual. Esto significa que dentro de dentro de seis meses, al final de octubre de 2020, pasará a ser la LTS (Long Term Support – soporte de largo plazo) Activa y estará lista para su uso general.

Node.js v14.0.0 se ha actualizado para usar V8 8.1, que soporta las últimas características de JavaScript. En este artículo, vamos a ver un resumen de estas características.

Encadenamiento opcional

Si eres desarrollador JavaScript, te habrás encontrado con la necesidad de comprobar si la propiedad de un objeto es null o undefined antes de acceder a él, como en el siguiente código:

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

Este tipo de código no es declarativo, y es propenso a errores. Seguro que te has encontrado a menudo con el error
Cannot read property ‘xxx’ of undefined (No se puede leer la propiedad ‘xxx’ de undefined).

Esto, además, tiene como consecuencia comprobar todos los valores, en lugar de comprobar sólo los no-null.

V8 versión 8.0 incorpora el Encadenamiento Opcional y su operador ?., de modo que el anterior código puede escribirse así:

const name = user?.details?.name

¿Qué pasaría si user details son undefined? JavaScript inicializa name undefined, en lugar de lanzar un error.

Otros casos de uso en los que el Encadenamiento Opcional es útil:

// user.details se borrar sólo si user esta definido
delete user?.details
// Usa el operador ?.() para llamar a métodos opcionales
const adminOption = user?.prefs?.getPrefs?.().option
// Usa el operador ?.[] para acceder a propiedades dinámicas
const rolesCount = user?.preferences?.['roles'].length
// Si usersArray es null o undefined entonces name será undefined
const userIndex = 5
const name = usersArray?.[userIndex].name

Coalescencia Nula

Un patrón común en JavaScript es usar el operador || para establecer valores por defecto, como en este ejemplo:

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

Pero, ¿qué pasaría si user.active es falso? Entonces la variable isActive seguiría siendo verdadero, causando probablemente un comportamiento inesperado en nuestro código.

V8 versión 8.0 nos ofrece el operado de Coalescencia Nula ?? que puede usarse en lugar de || para solucionar el problema anterior:

const isActive = user.active ?? true

isActive será verdadero si user.active es null o undefined, pero será falso si user.active es falso.

Encadenamiento Opcional + Coalescencia Nula

La Coalescencia Nula puede usarse para definir un valor opcional usando el Encadenamiento Opcional. En este ejemplo, name sera ‘desconocido’ si el objeto user no tiene la propiedad name dentro de details.

const isActive = user.active ?? true

Estas dos últimas características están relacionas con el módulo Intl

El objeto Intl es el namespace para la API de Internacionalización de ECMAScript, que proporciona comparaciones de cadenas, formateo de números y de fechas/horas teniendo en cuenta el idioma.

Intl.DisplayNames

La nueva API Intl.DisplayNames nos permite obtener traducciones de idioma, moneda y región en diferentes idiomas. Por ejemplo, si queremos nombres de región en español, usaremos el siguiente código:

 

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

O si queremos obtener los nombres de los idiomas en francés:

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

Finalmente, veamos un ejemplo para obtener los nombres de monedas en Chino simplificado:

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

Opciones de Intl.DateTimeFormat

La API Intl.DateTimeFormat se usa para trabajar con formatos de fecha y hora específicos de un idioma. Por ejemplo:

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"

Los formatos de fecha y hora pueden personalizarse usando el argumento options en el constructor de DateTimeFormat.

Esta API no es nueva y se añadió a V8 tiempo atrás, pero ahora soporta las options calendar numberingSystem:

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

Todas estas características se incluyen en Node.js v14.0 por defecto. Además, esta versión incluye otras características no relacionadas con V8 que puedes consultar en las notas del lanzamiento (en inglés). Podemos escribir más acerca de estas próximamente.

Puedes seguirme en Twiiter para más información acerca de Node.js

https://twitter.com/sebcurland

Puedes consultar el artículo original en inglés en:
https://medium.com/nmc-techblog/new-js-features-in-node-js-v14-0-6d833c7665b6