Javascript ES12 – ES2021

Javascript ES12 – ES2021

Mientras termino de redactar un nuevo curso, continuo ampliando el conocimiento sobre Javascript y para ellos vamos a ver las últimas features que se han incluido en la última versión de Javascript ES12 (ES2021).

A continuación veremos las features que se han incluido en esta nueva versión:

  • replaceAll()

    • Esta nueva feature nos permite remplazar todas las coincidencias de una cadena de texto.
    • const text = "Tu contraseña ha cambiado. Recuerda actualizar tu contraseña y guardar tu contraseña en un sitio seguro";
      
      text.replace('contraseña', 'PASSWORD')
      // "Tu PASSWORD ha cambiado. Recuerda actualizar tu contraseña y guardar tu contraseña en un sitio seguro"
      
      text.replaceAll('contraseña', 'PASSWORD')
      // "Tu PASSWORD ha cambiado. Recuerda actualizar tu PASSWORD y guardar tu PASSWORD en un sitio seguro"
  • Operador de asignación lógica

    • Este operador nos permite combinar los operadores lógicos ??, || && con una asignación.
    • &&=, la asignación solo se realiza si el valor es true.
    • ||=, la asignación solo se realiza si el valor es false.
    • ??=, la asignación solo se realiza si el valor es null undefined, siendo su comportamiento similar al operator nullish coalescing.
    • let status = true;
      let result = 'Hello';
      
      status &&= result;
      console.log('&&=', result, status); // Hello Hello
      
      status = false;
      status &&= result;
      console.log('&&=', result, status); // Hello false
      
      status = true;
      status ||= result;
      console.log('||=', result, status); // Hello true
      
      status = false;
      status ||= result;
      console.log('||=', result, status); // Hello Hello
      
      status = null;
      status ??= result;
      console.log('??=', result, status); // Hello Hello
      
      status = undefined;
      status ??= result;
      console.log('??=', result, status); // Hello Hello
      
      status = 0;
      status ??= result;
      console.log('??=', result, status); // Hello 0
  • Promise.any

    • Nos permite gestionar un array de promesas. capturando la primera que se resuelva satisfactoriamente.
    • En el caso de que ninguna se resuelva ninguna, nos devolverá un array de excepciones.
    • Existe otro método llamado .race() que funciona igual, solo que en este caso no importa si falla o resuelve.
    • (async () => {
          const fn = (status, time) => {
              return new Promise((resolve, reject) => {
                  setTimeout(() => {
                     status ? resolve('OK') : reject('FAIL');
                     resolve(status);
                  }, time);
              });
          };
          
          // Promise.any [OK ===> OK]
          try {
              const arr = [fn(true, 1000), fn(false, 100)]; // Se cumple antes el fallo, pero espera a la correcta
              const result = await Promise.any(arr);
              console.log('OK ===>', result);
          } catch(err) {
              console.log('ERR ===>', err);
          }
      
          // Promise.any (todas fallan) [ERR ===> AggregateError: All promises were rejected]
          try {
              const arr = [fn(false, 1000), fn(false, 100)]; // Se cumple antes el fallo, pero espera a la correcta
              const result = await Promise.any(arr);
              console.log('OK ===>', result);
          } catch(err) {
              console.log('ERR ===>', err);
          }
      
          // Promise.race [ERR ===> FAIL]
          try {
              const arr = [fn(true, 1000), fn(false, 100)]; // Se primera que se cumpla
              const result = await Promise.race(arr);
              console.log('OK ===>', result);
          } catch(err) {
              console.log('ERR ===>', err);
          }
          
      })();
  • Separadores numéricos

    • Con esta nueva feature podemos tener literales numéricos más legibles usando el carácter ‘_‘.
    • const numero = 1_000_000_000; // 1000000000
      
  • Intl.ListFormat

    • El objeto Intl se encuentra dentro del API de internacionalización de ECMAScript incluido en la versión anterior.
    • En esta nueva versión han incluido el nuevo constructor ListFormat, que permite formatear un array de strings en un string.
    • Puedes encontrar mas información aquí
    • const nombres = ['Iván', 'Gustavo', 'Juan Manuel'];
      const language = 'es';
      
      const formatA = new Intl.ListFormat(language, { style: 'long', type: 'conjunction' });
      console.log(formatA.format(nombres)); // Iván, Gustavo y Juan Manuel
      
      const formatB = new Intl.ListFormat(language, { style: 'long', type: 'disjunction' });
      console.log(formatB.format(nombres)); // Iván, Gustavo o Juan Manuel
  • Métodos de clase privados

    • En esta nueva revisión también han incluido métodos privados usando como prefijo a su definición la ‘#‘.
    • class Persona {
          #addPrivate(val) {
              console.log('PRIVATE...', val);
          }
          addPublic(val) {
              console.log('PUBLIC....', val);
          }
      }
      const P1 = new Persona();
      P1.addPublic(100);  // PUBLIC.... 100
      P1.addPrivate(200); // Uncaught TypeError: P1.addPrivate is not a function