Diferencia entre revisiones de «Programación en JavaScript/Control/Bucles»

De Wikilibros, la colección de libros de texto de contenido libre.
mSin resumen de edición
m Programación en JavaScript/Control/Bucles trasladada a Programación en JavaScript / Control / Bucles
(Sin diferencias)

Revisión del 22:28 18 jul 2005

Bucles.

En programación, la función principal de un programa es ser ejecutado para que sus instrucciones sean realizadas, bien por el procesador central (en el caso de un lenguaje compilado como C o Pascal), o por un interprete, que es un intermediario entre el programa y el procesador central. De esta forma, la ejecución lineal de las instrucciones genera acciones, cosas que nuestro programa hace porque se lo hemos indicado. Ahora bien, ¿Que ocurre cuando queremos hacer varias veces una misma cosa? Tendríamos que escribir el mismo código varias veces, aunque el problema sería más peliagudo si encima el número de veces a ejecutar el código fuera variable, cambiase según el estado del programa (definido por las variables). Para ello tenemos dos tipos de elementos fundamentales: bucles y funciones.

Un bucle permite repetir varias veces el mismo código en la misma situación, incluso aunque la repetición de ese código sea variable y no la misma cantidad de veces cada vez. Como estudiaremos luego, tenemos a nuestra disposición dos bucles, for y while. En el caso de JavaScript, los bucles son condicionales, es decir que, como en el caso de if, necesitamos de condiciones como las que hemos estudiado para realizar las repeticiones de código. En otros bucles existen bucles incondicionales, lo que significa que sólo pueden ir de cierto punto a cierto punto (por ejemplo, para contar de 1 a 10, aunque esto, como veremos, también lo podemos hacer con los condicionales).

For.

Un bucle for nos permite repetir un bloque de código según unas condiciones concretas, siempre que estas sean verdaderas. Un bucle for tiene tres partes:

  • inicialización: en esta parte, debemos indicar las variables que vamos a usar en las interacciones del bucle. Lo más habitual es declarar variables numéricas pero pueden ser perfectamente cadenas de caracteres, booleanos u objetos.
  • condición: una o varias condiciones (unidas por operadores lógicos), que definen si el bucle está en condiciones de ejecutarse o no.
  • operación: una expresión que normalmente (aunque no es imprescindible) modificará las variables definidas en la primera parte para que el código del bucle pueda usarlo en alguna operación concreta.

Un ejemplo simple de bucle for sería:

   for (x = 1; x < 10; x++)
   {
           document.write("El número es " + x + "<br>");
   }

Vamos a analizar este ejemplo. Fijémonos en la primera linea, donde podemos encontrar las tres partes que indicábamos antes:

  • x = 1: aquí usamos una variables x y le asignamos el valor '1', que será el valor de inicialización del bucle.
  • x < 10: nos encontramos con una condición muy simple, y que se leería como: "si x tiene un valor menor que 10, la condición es válida". Si la condición es válida, el bucle se seguirá ejecutando invariablemente. Veremos que eso puede generar un pequeño "problema", que a veces podemos incluso aprovechar para nuestros propósitos, el denominado "bucle infinito".
  • x++: aquí nos encontramos con una operación matemática usando un operador tipográfico "++", que viene a ser la misma operación que "x = x + 1". De hecho, también podemos usarla en vez de la que aparece, pero lo normal es que usemos un operador como este (de hecho, si estudiamos código realizado por otros, veremos que es la forma más común).

Visto como funcionan las diferentes partes de la declaración del bucle, podemos decir que significa:

"para una 'x' igual a 1, el bucle se ejecutará mientras el valor de 'x' sea menor que 10; al tiempo, cada vez que se ejecute el bucle, el valor de 'x' se incrementará en uno"

Así visto, el bloque de código que se encuentra entre llaves '{ }' se ejecutará mientras se cumpla la condición, siendo que 'x' se esta incrementando constantemente en 1 con cada ejecución del bucle. Como podemos ver también en el ejemplo, podemos usar la variable en las expresiones para, como por ejemplo en este caso, visualizar su valor tantas veces como se ejecute el bucle.

También podemos influir en el bucle, como en este caso:

   <html>
   <head>
   </head>
   <body>
   <script language="javascript">
   for (x = 1; x < 16; x++)
   {
           if (x % 2)
           {
                   x++;
           }
           document.write('Mi número es ' + x + '<br>');
   }
   </script>
   </body>
   </html>

Podemos apreciar en este ejemplo que el resultado no es el aparentemente esperado para este bucle, dado que aunque en la parte de operación incrementamos la variable sólo en 1, el resultado final es que sólo vemos números pares en la ventana. ¿Por qué? Fijémonos en el código del bucle:

  • el condicional if sólo será cierto en el caso de que el módulo de 'x' (la operación matemática de 'resto', representada por el operador '%') devuelva como resultado un valor impar.
  • si la condición de if se cumple, se ejecutará un trozo de código que incrementará el valor de 'x' en uno, influyendo de esta forma en el desarrollo del bucle.

De esta forma, en vez de mostrar los valores numéricos del 1 al 15, como sería en el caso normal, resulta que aparecen sólo valores pares. El truco en este código es sibilino pero potente: la operación 'x % 2' devolverá un 0 si 'x' es par, pero devolverá un valor distinto si es un número impar. ¿Esto que significa? Si el valor de la operación es cero, la condición es falsa (es un comportamiento muy habitual en muchos lenguajes de programación), con lo que la condición sólo será verdadera cuando 'x' sea impar. Un número impar devolverá un módulo mayor que cero al dividirlo entre 2. Al incrementar un valor impar en 1, se convierte en un valor par, que es lo que finalmente vemos en pantalla.

Parece enrevesado, pero un estudio a fondo de este código nos permite apreciar algunas de las propiedades ocultas de la programación en JavaScript. Muchas de estas propiedades y características se aprenden con la experiencia, pero en este curso veremos algunas de ellas que nos serán útiles en nuestro trabajo futuro.

Además, como derivación de que un bucle ejecuta código, esto nos lleva a que podemos anidar varios bucles uno dentro de otro, como en este caso:

   for (x = 1; x < 10; x++)
           for (y = 1; y < 10; y++)
                   document.write(x + ":" + y);

En este ejemplo, vemos que un bucle se ejecutará dentro del otro mostrándonos los valores de forma ordenada. No es preciso escribir llaves si el código a escribir es de una sola linea.

Para terminar este apartado, veamos rápidamente como realizar un bucle infinito con for:

   for (;;)
   {
           document.write("Esto no se acaba nunca...");
   }

Esto genera un pequeño problema... Si este bucle se ejecuta constantemente... ¿Qué hacemos para detenerlo o controlarlo? Usaremos dos palabras para controlar un bucle (sea cual sea), ya sea finito o infinito: break y continue.

break es la palabra reservada para cortar un bucle en un momento determinado. Es muy usada en condicionales if, ya que al darse una cierta condición, podemos controlar un bucle cortándolo cuando se dé un cierto momento concreto.

continue, sin embargo, también corta la ejecución del bucle, pero no igual que break. Mientras que break finaliza definitivamente el bucle, continue salta lo que queda de bucle y sigue la siguiente interacción sin más.

   var x = 1;
   for (;;)
   {
           x++;
           if (x > 5) break;
           document.write(x + '<br>');
   }

En este ejemplo vemos que, cuando el valor de 'x' sea mayor de 5, el bucle se romperá. Es otro nos permite apreciar el resultado de da continue:

   for (x = 1; x < 10; x++)
   {
           if (x % 2) continue;
           document.write(x '<br>');
   }

Ya nos podemos imaginar el resultado.

While.

Este bucle, como for, también es condicional, aunque mucho más simple que éste, como vemos en el siguiente ejemplo:

   var x = 1;
   while (x < 10)
   {
           document.write("Mi número es: " + x + "<br>");
           x++;
   }

Como vemos, este bucle es idéntico al primer for que estudiamos antes, aunque como podemos apreciar, mucho más simple. En realidad, la complejidad de for se ha descompuesto en partes separadas sencillas.

¿Para qué hay dos bucles que al fin y al cabo hacen los mismo? En el pasado, for era un bucle incondicional, es decir, que sólo podía ir de cierto punto a cierto punto, sin comprobaciones intermedias. Por eso se desarrolló while. Sin embargo, lenguajes más avanzados como C crearon un for condicional más potente. Sin embargo, aunque realizan funciones semejantes, while tiene como ventaja que al ser más simple, también es más rápido y eficaz en términos de rendimiento que for. Además, algunas operaciones resultan simplificadas:

   while (verdad)
   {
           if (verdad) document.write("Es verdad");
           verdad = !verdad;
   }

Este extraño ejemplo es significativo del uso de variables lógicas o booleanas. 'verdad' es una variable lógica que sólo puede tener los valores true y false. Si 'verdad' es true, el bucle se ejecutará. Al ejecutarse, también se comprobará la condicion interna y se imprimirá el mensaje "Es verdad". Lo interesante viene luego. La expresión "verdad = !verdad" significa "hacer que 'verdad' sea contrario a 'verdad'". Si 'verdad' era igual a true, ahora será igual a false (el operador '!', como sabemos, es la negación, y por lo tanto, cambiará el valor de la variable a su contrario). Dejo al alumno el realizar una versión for del bucle.

while tiene una versión inversa: do ... while. Este bucle tiene como diferencia respecto de while que, mientras que en while la condición se comprueba incluso antes de comenzar a ejecutar el bucle (lo que implica que si la condición ya fuese falsa antes de entrar en el bucle, este no llegaría a ejecutarse nunca), en do ... while la condición se comprueba a posteriori, con lo que tenemos la oportunidad de ejecutar el bucle al menos una vez. Esto también es una ventaja con respecto a for, que en ese sentido se comporta igual que while.

   var x = 0;
   
   do
   {
           document.write("Mi número es el " + x + "<br>");
           x++;
   } while (x < 10);