Estructuras de control

JavaScript acepta diferentes tipos de estructuras de control: condicionales y bucles. Es importante anotar que JavaScript no tiene un ámbito a nivel de bloques {} en versiones anteriores a ECMAScript 6. Esto significa que es indiferente si declara una variable dentro o fuera del bloque.

var x=1;
{
	var x = 2;
}
console.log(x); // 2

Aqui vemos algunos:

1. Condicional simple

Un condicional evalúa la cond y si esta es verdadera ejecuta la primera parte de script si es falta la segundo. Nunca ejecutara ambas.

condicion ? expr_verdadera : exp_falsa

if (condicion){
   ...  //verdadero
}else{
   ...  //falso
}
"La Cuota es de:  " + (isMember ? "$2.00" : "$10.00")
var x = Math.PI > 4 ? "Si" : "No";

var x = 10;
if (x > 5){
	console.log("Si, es mayor");
}else{
	console.log("No, no es mayor");
}

Los siguientes valores se evalúen como falso: false, undefined, null, 0, NaN, cadena vacia (""). El resto de valores incluidos los objetos son evaluados como verdaderos.

var x = new Boolean (false);
if (x)          // Esta condición se avalua true

No confundir los valores primitivos booleanos true y false con el verdadero y falso del objeto Boolean.

if (document.form1.threeChar.value.length == 3){
      return true;
   }else{
      alert("Introduce exactamente tres caracteres. " + document.form1.threeChar.value + " no es válido.");
      return false;
}

Se puede evaluar varias condiciones usando OR o AND.

2. Condicional múltiple

2.1 Condicional múltiple

if (cond 1){
   ...
}else if (cond 2){
   ...
}else if (cond 3){
   ...
}else{
   ...
}

2.2 Condicional múltiple

Una sentencia switch permite a un script evaluar una expresión e intentar igualar el valor de dicha expresión a una etiqueta de caso (case). Si se encuentra una coincidencia ejecutas las sentencia asociada.

switch (exp){
case val1:
   ...
   break;
case val2:
   ...
   break;
default:
   ...
}

De no usar break el script continuaria ejecutando las siguientes sentencias de los demás casos.

var x = "fresa";
switch (x){
case "uva":
   console.log("Las uvas cuestan 6.90 soles kg.");
   break;
case "fresa":
   console.log("Las fresas cuestan 9.50 soles kg.");
   break;
 default:
   console.log("Todas las demás frutas cuestan 3.80 soles kg.");
}
var nota = 12;
switch (nota){
case 11:
case 12:
case 13:
   console.log("Suficiente.");
   break;
case 14:
case 15:
case 16:
   console.log("Bien.");
   break;
case 17:
case 18:
case 19:
case 20:
   console.log("Excelente.");
   break;
 default:
   console.log("Jalado.");
}

3. Bucle fijo

Los bucles ofrecen una manera rápida y fácil de hacer algo repetidas veces. El bucle fijo se usa cuando se sabe de antemano el numero de veces que tenemos que ejecutar las sentencias.

for (ini; cond; incremento){
   ...
}
for (n=0; n<5; n++){
   consoles.log(n);
}

3.1 Para objetos

for...in está construido para iterar propiedades de objeto, principalmente porque no es necesario saber de antemano el numero de propiedades que contienen. El bucle for...in iterará sobre todas las propiedades de un objeto. Más tecnicamente, iterará sobre cualquier propiedad en el objeto que haya sido internamente definida con su propiedad [[Enumerable]] configurada como true.

for (variable in objeto){
   ...
}
let matriz = [3,5,7];
for (let i in matriz){   
   resp += obj + "." + i + " = " + obj[i] + "<br>";
}

3.2 Para elementos

for..off esat construido para ejecutar bloques de codigo para cada elemento Matriz. La sintaxis de for...of es específica para las colecciones, y no para todos los objetos. Esta Iterará sobre cualquiera de los elementos de una colección que tengan la propiedad [Symbol.iterator].

for (variable of iterable){
   ...
}
let matriz = [10, 20, 30];
for (let n of matriz) {
  console.log(n);
}
let matriz = new map( [['a',1],['b',2],['c',3]] );
for (let [n,y] of matriz) {
  console.log(y);  //1,2,3
}
let matriz = [3,5,7];
matriz.ult = "Hola";
for (let i in matriz){
   console.log(i);  //0,1,2,ult
}
for (let i of matriz){
   console.log(i);  //3,5,7,Hola
}

Atención que también se puede usar con una cadena. En ejemplo anterior matriz = 'Somos libres'.

3.3 Asincrono o sincrono

Crea un bucle iterando tanto sobre objetos iterables asincrónicos como sincronos. Es decir se puede usar en matrices, MAP, SET, etc pero lo mas interesante es usarlo cobre NodeList

for await (variable of iterable){
   ...
}

Puede usar también break y continue.

4. Bucle condicional

Los bucles ofrecen una manera rapida y facil de hacer algo repetidas veces. El bucle condicional se usa cuando el numero de veces a ejecutar el codigo dependera de ciertas condiciones internas que las propias sentencias vana alterando.

4.1 Bucle condicional previo

Crea un bucle que ejecuta una sentencia especificada mientras cierta condición se evalúe como verdadera. Dicha condición es evaluada antes de ejecutar la sentencia

while (cond){
   ...
}
n=0;
while (n<3){
	...
	n++;
}

4.2 Bucle condicional posterior

La sentencia (hacer mientras) crea un bucle que ejecuta una sentencia especificada, hasta que la condición de comprobación se evalúa como falsa. La condición se evalúa después de ejecutar la sentencia, dando como resultado que la sentencia especificada se ejecute al menos una vez.

do{
   ...
}while (cond);

n=0;
do{
	...
	n++;
}while (n<3)

5. Manejo de excepciones

Puedes lanzar excepciones usando la sentencia throw y manejarlas usando las sentencias try...catch. Prácticamente cualquier objecto puede ser lanzado en JavaScript. Sin embargo, no todos los objetos lanzados son creados igual. Mientras que es bastante común lanzar números o cadenas como errores, frecuentemente es más efectivo usar una excepcion específicamente creada para este proposito.

throw exp;
throw 42;         // Tipo número
throw "Error2";   // Tipo cadena
throw true;       // Tipo booleano
throw {toString: function() { return "Soy un objeto"; }};

La sentencia try...catch marca un bloque de instrucciones a intentar que pueden causar alguna excepción, y declarar una o más respuestas en caso de que una excepción sea arrojada. Si una excepción es arrojada, la sentencia try...catch se encarga de atraparla.

6. Salto

Es un identificador que permite luego referirse a él desde cualquier lugar del script. Por ejemplo, usted puede usar un label para identificar un bucle y usar las sentencias

  • break
  • o
  • continue
  • para indicar si el script debe interrumpir un bucle o continuar su ejecución.

    label:
       ...
    
    aqui:
    	...
    

    7. Break

    Se usa para salir de un bucle. Cuando usas break dentro de un swtch, for, while o do-while se transfiere el control a la siguiente sentecia fuera del bucle. Cuando usas break label te lleva al label.

    break;
    break label;
    

    8. Continue

    Termina la iteración en curso dentro del bucle de una sentencia for, while o do-while y continúa la ejecución del bucle con la siguiente iteración. A diferencia de la sentencia break, continue no termina la ejecución del bucle, solo interrumpe la ejecución y regresa a evaluar la condicion (while). En un bucle for, salta a incrementar. Cuando se usa continua con una etiqueta simplemente salta a la etiqueta.

    continue;
    continue label;
    

    9. Return

    return [ expresion ];
    
    function cuadrado(x) {
       return x*x;
    }