1. Optional Chaining (Operador ?)
Era bastante moroso (tedioso, molesto, aburrido, etc.) estar validando una serie de propiedades de un objeto para estar seguros que existían.
Primero, el error común:
const obj = { atrib: { a: 1 }, otroAtrib: { a: 1 } }; // imprime 1 ya que la propiedad existe console.log(obj.atrib.a); // Ups, cannot read property "a" of undefined (error, tristes noticias) console.log(obj.atribNoExiste.a);
Ahora la solución habitual (condiciones, condiciones, CONDICIONES!!!):
const obj = { atrib: { a: 1 }, otroAtrib: { a: 1 } }; if (obj !== undefined && obj.atribNoExiste !== undefined && obj.atribNoExiste.a !== undefined) { console.log(obj.atribNoExiste.a); } else { console.log("La propiedad necesaria no existe"); }
Y ahora un poco de magia...
const obj = { atrib: { a: 1 }, otroAtrib: { a: 1 } }; // Maravilla!!! no sería error, retornaría undefined console.log(obj.atribNoExiste?.a); console.log(obj.atribNoExiste?.otro.otro); console.log(obj.otroAtrib?.b?.d);
El operador ? nos ayudará a evitar las condiciones del mal xD.
2. Null Coalescing (Operador ??)
La solución al problema de los valores nulos.
Primero, lo que se hacía comúnmente y que ocasionaba errores que encontré en muchos códigos fuente (el operador || suele utilizarse para dar valores "por defecto"):
function sumaCuatro(val) { // si val no existe, asignar el valor 10 (¿o no?) const num = val || 10; return num + 4; } // no mandamos ningún valor, el resultado sería 14 console.log(sumaCuatro()); // mandamos undefined, el resultado sería 14 console.log(sumaCuatro(undefined)); // mandamos 0, el resultado debería ser 4 pero será 14 :( console.log(sumaCuatro(0));
El problema es que el operador || trabaja con valores falsy (https://developer.mozilla.org/en-US/docs/Glossary/Falsy), por lo tanto no solamente se asigna el valor por defecto cuando es null o undefined sino también cuando otro valor falsy es enviado (por ejemplo 0).
La solución (el esperado operador ??):
function sumaCuatro(val) { // si val no existe, asiganar el valor 10 (¿o no?) const num = val ?? 10; return num + 4; } // no mandamos ningún valor, el resultado sería 14 console.log(sumaCuatro()); // mandamos undefined, el resultado sería 14 console.log(sumaCuatro(undefined)); // mandamos 0, el resultado es 4 como debe ser!!! console.log(sumaCuatro(0));
El operador ?? solamente asigna el valor por defecto en caso de que el valor comparado sea null o undefined.
3. Diagnostics
Se agregaron varias herramientas para diagnosticar tu aplicación en la versión 12 y ahora por fin son oficiales!!! Escribiré sobre estas herramientas en otro post porque es un poco más complejo y este es un post casual XD keep coding!!!
No hay comentarios:
Publicar un comentario