Funciones que veremos en Javascript este 2021

En el momento de escribir este artículo, las siguientes características de la propuesta de JavaScript se han convertido en la etapa 4 y es casi seguro que se incluirán en ES2021. Ya se pueden comenzar a usar en las últimas versiones de navegadores, Node.js y Babel.

Nota: ECMAScript es el estándar en el que se basa JavaScript, administrado por el comité TC39. ECMAScript siempre fue un nombre no deseado que hace que todo sea confuso para los principiantes. La gente suele hablar de las funciones de JavaScript, pero se refiere a la especificación ECMAScript.

Separadores numéricos

Habilita los guiones bajos (_, U + 005F) como separadores en literales numéricos para mejorar la legibilidad y no tener semántica en tiempo de ejecución. Funciona para literales numéricos (int, bigint, float), partes fraccionarias y exponentes.

1_000_000_000 // números decimales
0b1010_0001 // números binarios
101_475_938.38 // números de punto flotante
0.000_001 // en parte fraccionaria
1e10_000 // como exponente

Asignación lógica

Admite la asignación lógica con los nuevos operadores && =, || = y ?? =. Las asignaciones lógicas solo realizan una asignación si la operación lógica evalúa el lado derecho.

// Falso: false, 0, -0, 0n, "", null, undefined y NaN
// Verdadero: todos los valores son verdaderos a menos que se defina como falso
// Null: null, undefined

a || = b
// Asignación lógica OR
// Es lo mismo que: a || (a = b);
// Solo asigna si 'a' es falso

a && = b
// Asignación lógica AND
// Es lo mismo que: a && (a = b);
// Solo asigna si 'a' es verdadero

a ?? = b
// Asignación de nulidad lógica
// Es lo mismo que: a ?? (a = b);
// Solo asigna si 'a' es nulo

Referencias débiles

Esta función contiene dos objetos avanzados WeakRef y FinalizationRegistry. Estas interfaces se pueden utilizar de forma independiente o conjunta, según el caso de uso. Su uso correcto requiere una cuidadosa reflexión, y es mejor evitarlos si es posible.

Un WeakRef es un objeto que se usa para hacer referencia a un objeto de destino sin preservarlo de la recolección de basura. WeakRefs puede eliminar la referencia para permitir el acceso al objeto de destino, si el objeto de destino no ha sido reclamado por la recolección de basura.

// Crea un objeto WeakRef que hace referencia a un objeto dado
const ref = new WeakRef(objetoDestino)

// Devuelve el objeto de destino de la instancia de WeakRef, o indefinido si el objeto de destino ha sido recolectado como basura
const obj = ref.deref()

Un objeto FinalizationRegistry permite solicitar una devolución de llamada cuando un objeto se recolecta como basura.

// Crea un objeto de registro que usa la devolución de llamada dada
const registro = new FinalizationRegistry([callback]);

// Registre un objeto con una instancia de registro para que, si el objeto se recolecta como basura, se puede llamar a la devolución de llamada del registro
registro.register(objetivo, valorRetenido, [tokenNoRegistrado]);

// Anular el registro de un objeto de destino de una instancia de registro
registro.unregister(tokenNoRegistrado);

Promise.any()

Promise.any() acepta una serie de promesas y devuelve una promesa que se cumple con la primera promesa dada que se cumple, o se rechaza con un AggregateError que contiene las razones de rechazo si se rechazan todas las promesas dadas.

Este método es útil para devolver la primera promesa que se cumple. No espera a que las otras promesas se completen una vez que encuentra una.

Promise.any(promises).then(
  (first) => {
    // Cualquiera de las promesas se cumplió.
  },
  (error) => {
    // Todas las promesas fueron rechazadas.
  }
)

String.prototype.replaceAll()

Actualmente no hay forma de reemplazar todas las instancias de un substring en un string sin el uso de una expresión regular global. String.prototype.replace solo afecta a la primera aparición cuando se usa con un string.

String.prototype.replaceAll() daría a los desarrolladores una forma sencilla de realizar esta operación básica común.

'aabbcc'.replaceAll('b', '.') // 'aa..cc'
'aabbcc'.replaceAll(/b/g, '.') // 'aa..cc'