ES9 - Nuevas funciones

Aquí, aprenderemos sobre las nuevas funciones de ES9. Comencemos por comprender acerca de los generadores asincrónicos.

Generadores asincrónicos e iteración

Los generadores asincrónicos se pueden convertir en asincrónicos utilizando el asyncpalabra clave. lossyntax para definir un generador asincrónico se da a continuación:

async function* generator_name() {
   //statements
}

Ejemplo

El siguiente ejemplo muestra un generador asincrónico que devuelve Promise en cada llamada al next() método de generador.

<script>
   async function* load(){
      yield await Promise.resolve(1);
      yield await Promise.resolve(2);
      yield await Promise.resolve(3);
   }
   
   let l = load();
   l.next().then(r=>console.log(r))
   l.next().then(r=>console.log(r))
   l.next().then(r=>console.log(r))
   l.next().then(r=>console.log(r))
</script>

La salida del código anterior será la siguiente:

{value: 1, done: false}
{value: 2, done: false}
{value: 3, done: false}
{value: undefined, done: true}

en espera de bucle

Los iterables asincrónicos no se pueden iterar utilizando el método tradicional for..of loopsintaxis a medida que devuelven promesas. ES9 presenta elfor await of loop apoyar asynchronous iteration.

La sintaxis para usar el for await of loop se da a continuación, donde,

  • En cada iteración se asigna un valor de una propiedad diferente a variable y una variable puede declararse con const, let o var.

  • iterable - Objeto cuyas propiedades iterables se van a iterar.
for await (variable of iterable) {
   statement
}

Ejemplo

El siguiente ejemplo muestra el uso de for await of loop para iterar un generador asincrónico.

<script>
   async function* load(){
      yield await Promise.resolve(1);
      yield await Promise.resolve(2);
      yield await Promise.resolve(3);
   }

   async function test(){
      for await (const val of load()){
         console.log(val)
      }
   }
   test();
   console.log('end of script')
</script>

La salida del código anterior será como se muestra a continuación:

end of script
1
2
3

Ejemplo

El siguiente ejemplo itera una matriz usando el ciclo de espera de.

<script>
   async function fntest(){
      for await (const val of [10,20,30,40]){
         console.log(val)
      }
   }
   fntest();
   console.log('end of script')
</script>

La salida del código anterior será la siguiente:

end of script
10
20
30
40

Propiedades de reposo / propagación

ES9 admite el uso de operadores Rest y Spread con objetos.

Ejemplo: operador de objetos y restos

El siguiente ejemplo muestra el uso del operador rest con un objeto. El valor de la propiedad de edad del estudiante se copia en la variable de edad, mientras que los valores de las propiedades restantes se copian en la otra variable usando la sintaxis de resto `...`.

<script>
   const student = {
      age:10,
      height:5,
      weight:50
   }
   const {age,...other} = student;
   console.log(age)
   console.log(other)
</script>

La salida del código anterior será como se indica a continuación:

10
{height: 5, weight: 50}

Ejemplo: operador de objeto y propagación

El operador de propagación se puede utilizar para combinar varios objetos o clonar objetos. Esto se muestra en el siguiente ejemplo:

<script>
   //spread operator
   const obj1 = {a:10,b:20}
   const obj2={c:30}
   //clone obj1
   const clone_obj={...obj1}
   //combine obj1 and obj2
   const obj3 = {...obj1,...obj2}
   console.log(clone_obj)
   console.log(obj3)
</script>

La salida del código anterior será como se indica a continuación:

{a: 10, b: 20}
{a: 10, b: 20, c: 30}

Promesa: finalmente ()

los finally()se ejecuta siempre que se establece una promesa, independientemente de su resultado. Esta función devuelve una promesa. Se puede utilizar para evitar la duplicación de código tanto en la promesathen() y catch() manipuladores.

Sintaxis

La sintaxis mencionada a continuación es para la función finally().

promise.finally(function() {
});
promise.finally(()=> {
});

Ejemplo

El siguiente ejemplo declara una función asincrónica que devuelve el cuadrado de un número positivo después de un retraso de 3 segundos. La función arroja un error si se pasa un número negativo. Las declaraciones en el bloque finalmente se ejecutan en cualquier caso, ya sea que la promesa se rechace o se resuelva.

<script>
   let asyncSquareFn = function(n1){
      return new Promise((resolve,reject)=>{
         setTimeout(()=>{
            if(n1>=0){
               resolve(n1*n1)
            }
            else reject('NOT_POSITIVE_NO')
         },3000)
      })
   }
   console.log('Start')

   asyncSquareFn(10)//modify to add -10
   .then(result=>{
      console.log("result is",result)
   }).catch(error=>console.log(error))
   .finally(() =>{
      console.log("inside finally")
      console.log("executes all the time")
   })

   console.log("End");
</script>

La salida del código anterior será como se muestra a continuación

Start
End
//after 3 seconds
result is 100
inside finally
executes all the time

Revisión literal de plantilla

A partir de ES7, las plantillas etiquetadas se ajustan a las reglas de las siguientes secuencias de escape:

  • Las secuencias de escape Unicode se representan mediante "\u", por ejemplo \u2764\uFE0F

  • Las secuencias de escape de puntos de código Unicode se representan mediante "\u{}", por ejemplo \u{2F}

  • Las secuencias de escape hexadecimales se representan mediante "\x", por ejemplo \xA8

  • Las secuencias de escape literal octales se representan mediante "" y seguidas de uno o más dígitos, por ejemplo \125

En ES2016 y versiones anteriores, si se utilizan secuencias de escape no válidas con funciones etiquetadas, se generará un error de sintaxis como se muestra a continuación:

//tagged function with an invalid unicode sequence
myTagFn`\unicode1`
// SyntaxError: malformed Unicode character escape sequence

Sin embargo, a diferencia de las versiones anteriores, ES9 analiza la secuencia Unicode no válida como indefinida y no arroja ningún error. Esto se muestra en el siguiente ejemplo:

<script>
   function myTagFn(str) {
      return { "parsed": str[0] }
   }
   let result1 =myTagFn`\unicode1` //invalid unicode character
   console.log(result1)
   let result2 =myTagFn`\u2764\uFE0F`//valid unicode
   console.log(result2)
</script>

La salida del código anterior será como se muestra a continuación:

{parsed: undefined}
{parsed: "❤️"}

Cuerdas crudas

ES9 introduce una propiedad especial raw, disponible en el primer argumento de la función de etiqueta. Esta propiedad le permite acceder a las cadenas sin procesar tal como se ingresaron, sin procesar las secuencias de escape.

Ejemplo

<script>
   function myTagFn(str) {
      return { "Parsed": str[0], "Raw": str.raw[0] }
   }
   let result1 =myTagFn`\unicode`
   console.log(result1)

   let result2 =myTagFn`\u2764\uFE0F`
   console.log(result2)
</script>

La salida del código anterior será la siguiente:

{Parsed: undefined, Raw: "\unicode"}
{Parsed: "❤️", Raw: "\u2764\uFE0F"}

Característica de expresión regular

En las expresiones regulares, el operador de punto o un punto se usa para hacer coincidir un solo carácter. los. dot operator salta caracteres de salto de línea como \n, \r como se muestra en el siguiente ejemplo:

console.log(/Tutorials.Point/.test('Tutorials_Point')); //true
console.log(/Tutorials.Point/.test('Tutorials\nPoint')); //false
console.log(/Tutorials.Point/.test('Tutorials\rPoint')); //false

Un patrón de expresión regular se representa como / regular_expression /.El método test () toma un parámetro de cadena y busca el patrón de expresiones regulares. En el ejemplo anterior, eltest() methodbusca un patrón que comienza con Tutoriales, seguido de cualquier carácter y termina con Punto. Si usamos el\n o \r en la cadena de entrada entre Tutoriales y Point, el método test () devolverá falso.

true
false
false

ES9 presenta una nueva bandera: DotAllFlag (\s)que se puede usar con Regex para combinar terminadores de línea y emojis. Esto se muestra en el siguiente ejemplo:

console.log(/Tutorials.Point/s.test('Tutorials\nPoint'));
console.log(/Tutorials.Point/s.test('Tutorials\rPoint'));

La salida del código anterior será la que se menciona a continuación:

true
true

Grupos de captura nombrados

Antes de ES9, los índices accedían a los grupos de captura. ES9 nos permite asignar nombres a los grupos de captura. La sintaxis para el mismo se da a continuación:

(?<Name1>pattern1)

Ejemplo

const birthDatePattern = /(?<myYear>[0-9]{4})-(?<myMonth>[0-9]{2})/;
const birthDate = birthDatePattern.exec('1999-04');
console.log(birthDate.groups.myYear);
console.log(birthDate.groups.myMonth);

La salida del código anterior es como se muestra a continuación:

1999
04