informatica:programacion:cursos:programacion_avanzada_javascript:otras_caracteristicas_ecmascript
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:cursos:programacion_avanzada_javascript:otras_caracteristicas_ecmascript [2024/10/29 16:14] – [Valores por defecto para parámetros opcionales] tempwin | informatica:programacion:cursos:programacion_avanzada_javascript:otras_caracteristicas_ecmascript [2024/10/30 13:13] (actual) – [Paréntesis obligatorios] tempwin | ||
|---|---|---|---|
| Línea 185: | Línea 185: | ||
| El resultado es que **se produce un error**: '' | El resultado es que **se produce un error**: '' | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | El error que se produce | + | |
| - | </ | + | |
| El motivo es que, al combinar este tipo de operadores, hagas lo que hagas con la precedencia no puedes evitar que la interpretación que hace el programador de lo que está escribiendo entre en conflicto con lo que el diseñador del lenguaje haya decidido. Por ejemplo, en el fragmento anterior, eso se puede interpretar como: | El motivo es que, al combinar este tipo de operadores, hagas lo que hagas con la precedencia no puedes evitar que la interpretación que hace el programador de lo que está escribiendo entre en conflicto con lo que el diseñador del lenguaje haya decidido. Por ejemplo, en el fragmento anterior, eso se puede interpretar como: | ||
| Línea 207: | Línea 205: | ||
| En este ejemplo, como el operando de la izquierda no es '' | En este ejemplo, como el operando de la izquierda no es '' | ||
| + | |||
| + | ===== El operador de encadenamiento opcional: evitando errores por nulos ===== | ||
| + | |||
| + | El operador de encadenamiento opcional, ''? | ||
| + | |||
| + | Un caso habitual es el siguiente: estamos accediendo a un servicio que nos devuelve información de objetos que necesitamos para nuestra aplicación. Estos objetos pueden tener a su vez varios subobjetos a los que necesitamos acceder para hacer cosas, por ejemplo: | ||
| + | |||
| + | <code javascript> | ||
| + | if (usuario.direccion.planta.length > 0) { | ||
| + | //lo que sea... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | El problema de lo anterior es que es posible que el usuario no tenga dirección, y si la tiene quizá no tiene el campo de la planta en la que vive (porque es una casa unifamiliar, | ||
| + | |||
| + | <code javascript> | ||
| + | if (usuario && usuario.direccion && usuario.direccion.planta) { | ||
| + | if (usuario.direccion.planta.length > 0) { | ||
| + | //lo que sea... | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Es decir, antes de poder utilizar nuestra expresión original debemos comprobar que todos los elementos de la cadena de propiedades existen (no son nulos), para asegurarnos de que no se produce un error. | ||
| + | |||
| + | <WRAP center round tip 60%> | ||
| + | Obviamente sólo es necesario comprobar aquellos que puedan estar nulos. Por ejemplo, su el usuario siempre va a existir como resultado de la llamada al servicio (o sea, el servicio no nos va a devolver nunca un nulo), la primera comprobación ('' | ||
| + | </ | ||
| + | |||
| + | Lo anterior funciona porque el operador AND (''&&'' | ||
| + | |||
| + | Este tipo de expresiones es muy habitual verlas por ahí y funcionan bien, pero **son tediosas de escribir, largas y no contribuyen precisamente a la claridad del código**. | ||
| + | |||
| + | Por suerte, ECMAScript nos proporciona un elemento específico para facilitarnos la vida: el operador de encadenamiento opcional: ?.. Gracias a él podemos escribir esto: | ||
| + | |||
| + | <code javascript> | ||
| + | if (usuario? | ||
| + | //lo que sea... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Es decir, al ponerlo delante de una propiedad, ésta **sólo se evalúa si el objeto precedente no es nulo ni '' | ||
| + | |||
| + | Lo que se obtiene en caso de que algún punto de la cadena sea nulo o no definido es **un valor no definido**, o sea '' | ||
| + | |||
| + | Esto es equivalente a usar todos aquellos ''&&'' | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | MUY IMPORTANTE: el primer objeto de la cadena debe existir y estar definido, ya que el operador necesita al menos un objeto " | ||
| + | </ | ||
| + | |||
| + | ==== Llamadas a funciones ==== | ||
| + | |||
| + | Pero este operador sirve para más cosas que simplemente encadenar propiedades de objetos. También es posible utilizarlo para hacer **llamadas a funciones, sólo si la función está definida**. Por ejemplo: | ||
| + | |||
| + | <code javascript> | ||
| + | var res = usuario? | ||
| + | </ | ||
| + | |||
| + | Esta sintaxis tan rara, ''? | ||
| + | |||
| + | Es importante señalar que si el supuesto método existe pero no es un método, se producirá un error de tipos. Es decir, lo anterior funciona si el miembro que queremos llamar no existe. Pero, en nuestro ejemplo, si '' | ||
| + | |||
| + | ==== Cortocircuito de expresiones ==== | ||
| + | |||
| + | Este operador también incluye cortocircuito de expresiones. Es decir, que en cuanto se encuentra un eslabón de la cadena que es nulo o no definido, no sigue evaluando los demás. Así, por ejemplo: | ||
| + | |||
| + | <code javascript> | ||
| + | var n = 0; | ||
| + | var res = usuario? | ||
| + | </ | ||
| + | |||
| + | ...si el usuario o si la función '' | ||
| + | |||
| + | ==== Acceso a arrays ==== | ||
| + | |||
| + | En JavaScript una alternativa a la sintaxis '' | ||
| + | |||
| + | <code javascript> | ||
| + | var color = usuario.ajustes[' | ||
| + | </ | ||
| + | |||
| + | que es equivalente a: | ||
| + | |||
| + | <code javascript> | ||
| + | var color = usuario.ajustes.color; | ||
| + | </ | ||
| + | |||
| + | La ventaja de la primera sintaxis es que nos permite decidir el nombre de la propiedad dinámicamente, | ||
| + | |||
| + | <code javascript> | ||
| + | var nomAjuste = obtenerNombreAjusteColor(); | ||
| + | var color = usuario.ajustes.[nomAjuste]; | ||
| + | </ | ||
| + | |||
| + | cosa que no podríamos hacer con la sintaxis habitual del punto. | ||
| + | |||
| + | En este caso, si la propiedad es nula o no está definida JavaScript devuelve un error. O sea, en este ejemplo si el servicio nos devuelve un '' | ||
| + | |||
| + | Para facilitar este caso, una tercera sintaxis de este operador nos permite **acceder al contenido de arrays o colecciones aunque sean nulas o no estén definidas**: | ||
| + | |||
| + | <code javascript> | ||
| + | var color = usuario? | ||
| + | </ | ||
| + | |||
| + | En este caso está intentando acceder a las propiedades del objeto '' | ||
| + | |||
| + | Fíjate además que, por el cortocircuito de expresiones, | ||
| + | |||
| + | Nos vale también para arrays normales y corrientes accedidas mediante índice: | ||
| + | |||
| + | <code javascript> | ||
| + | var color = usuario? | ||
| + | </ | ||
| + | |||
| + | De este modo si '' | ||
| + | |||
| + | ==== Devolver algo diferente a no definido ==== | ||
| + | |||
| + | Finalmente, podemos combinar ese nuevo operador con el operador de unión " | ||
| + | |||
| + | <code javascript> | ||
| + | var color = usuario? | ||
| + | </ | ||
| + | |||
| + | que en caso de no estar definido devolvería un color por defecto (el color blanco). | ||
| + | |||
| + | ==== En resumen ==== | ||
| + | |||
| + | El operador ''? | ||
| + | |||
| + | El soporte de este operador es total en los navegadores // | ||
informatica/programacion/cursos/programacion_avanzada_javascript/otras_caracteristicas_ecmascript.1730214854.txt.gz · Última modificación: por tempwin
