En este video quisiera mostrarles las caracteristicas nuevas que hay en Javascript en este año 2022.
Top Level Await
Antes solo se podia usar un await dentro del alcance de una async function, es por esto que si queriamos importar un modulo de forma asincrona teniamos que hacerlo de esta manera:
Antes:
import('./math.js').then(math => {
console.log(math.sum(1, 2));
})
Pero actualmente, se puede hacer de este modo:
Despues:
// Top level await
const math = await import("./math.js")
console.log(math.sum(10, 20))
De hecho tambien puedes usarlo con la api fetch nativa de Nodejs, que tampoco es necesaria instalarla en Nodejs:
const response = await fetch('https://jsonplaceholder.typicode.com/users')
const data = await response.json()
console.log(data)
Tambien puedes manejar el error:
try {
throw new Error("My Error!!!");
const response = await fetch("https://jsonplaceholder.typicode.com/users");
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
o tambien podras usarlo para inicializar un recurso:
try {
const db = await mongoose.connect("mongodb://localhost/mydb");
console.log(db.connection.name);
} catch (error) {
console.error(error);
}
Esto nos evitara que tener que usar una funcion inmediatamente invocada: https://v8.dev/features/top-level-await
El cambio más importante con el top level await es que se modifica el orden de ejecución de los módulos. Hasta ahora el orden de ejecucuón (post-order) ha sido siempore sincrono y determinista. Con el nuevo top-level await esto cambia.
La ejecución del modulo es diferida hasta que la promesa es resuelta. La ejecución del módulo padre también es pospuesta hasta que todos los hijos que usan await estén resueltos.
Array at
este metodo permite obtener un elemento en un indice determinado, al igual que usar []:
const x = [10, 33, 44, 55, 66, 77, 88, 99];
console.log(x[0])
console.log(x.at(0))
console.log(x.at(-1))
console.log(x.at(-2))
console.log(x.at(-4))
Object has Own
Permite revisar si un elemento tiene unas nuevas propiedades:
const x = [10, 33, 44, 55, 66, 77, 88, 99];
console.log(x[0])
console.log(x.at(0))
console.log(x.at(-1))
console.log(x.at(-2))
console.log(x.at(-4))
Clases
Las clases ahora tienen los siguientes nuevas caracteristicas
Instacias de Clases publicas y privadas
Ahora es posible definir atributos directamente dentro de la cuerpo de la clase.
class User {
name
surname
}
console.log(new User())
las propiedades siguen siendo publicas por defecto
propiedades privadas
Tambien puedes crear propiedades privadas #salt
class User {
name
surname
#salt
}
Estos solo pueden ser cambiados y accedidos desde la propia clase.
class User {
name
surname
password = 'mypassword'
#salt = '123'
encryptPassword() {
return this.password + this.#salt
}
}
console.log(new User().encryptPassword())
esto lanza un error:
console.log(new User().#salt)
private methods
class Test {
#addTestRunner(testRunner){
this.testRunner = testRunner
}
}
const test = new Test();
test.addTestRunner({name: 'test'});
private getters and setters
Private accessors (getters and setters) Previously when was needed to declare a getter or setter can be accessed by means of the instance created, with ES2022 was added as a new feature the private accessors.
class Test {
get #name(){
return 'test-name';
}
}
const test = new Test();
test.name
// Output: undefined
Finalmente en mi caso he probado estas caracteristicas usando Nodejs v18, pero tambien puedes usarlas en versiones anteriores si usas Babel.
Estas son algunas fechas exactas acerca desde cuando estuvieron disponibles estas caracteristicas:
Top-level await: Available since 2021 in browsers, 2020 in Node.
Private instance fields, methods, and accessors: Available since 2019 in browsers and Node.
Static class fields and methods: Available since 2016 in browsers and Node.
Static class initialization blocks: Available since 2021 in browsers and Nod e.
Error: .cause: Available since 2021 in browsers and Node.
Array, String, and TypedArray: .at() Method: Available since 2021 in browsers and Node.
Object: .hasOwn(): Available since 2021 in browsers and Node.
RegExp: match .indices ('d' flag): Available since 2021 in browsers and Node.
You can check the dates by looking at the compatibility table in MDN for each feature (for hasIndices it says Node doesn't support that, but it was added on Node 16, so the article is just outdated).
https://dev.to/brayanarrieta/new-javascript-features-ecmascript-2022-with-examples-4nhg