JScript  

Controlar el flujo del programa

Normalmente, las instrucciones de una secuencia de comandos de JScript se ejecutan una detrás de otra, en el orden en que se han escrito. Esto se denomina ejecución secuencial y es la dirección predeterminada del flujo del programa.

Una de las alternativas a este tipo de ejecución transfiere el flujo del programa a otra parte de la secuencia de comandos. Es decir, en lugar de ejecutar la instrucción siguiente de la secuencia, se ejecuta otra.

Para que la secuencia de comandos sea útil, esta transferencia de control debe realizarse de una forma lógica. La transferencia del control del programa se basa en una decisión, cuyo resultado es una instrucción del valor de verdad (que devuelve un tipo Booleano true o false). Se crea una expresión y a continuación se prueba si su resultado es verdadero. Para ello hay dos clases principales de estructuras de programa.

La primera es la estructura de selección. Utilícela para especificar rutas alternativas para el flujo del programa y crear de este modo un entronque en el programa (como un desvío en una carretera). En JScript hay disponibles cuatro tipos de estructuras de selección.

El segundo tipo de estructura de control de programas es la estructura de repetición. Utilícela para especificar que una acción se repita mientras alguna condición siga siendo verdadera. Cuando las condiciones de la instrucción de control se hayan cumplido (normalmente después de un número específico de repeticiones), el control se transferirá a la siguiente instrucción externa a la estructura de repetición. En JScript hay disponibles cuatro tipos de estructuras de repetición.

Es posible crear secuencias de comandos muy complejas mediante la anidación y el apilamiento de las estructuras de control de selección y repetición.

El tercer tipo de flujo de programa estructurado, el control de excepciones, no se trata en este documento.

Usar instrucciones condicionales

JScript admite las instrucciones condicionales if e if...else. En las instrucciones if se prueba una condición y, si satisface la prueba, se ejecuta el código de JScript apropiado. En la instrucción if...else se ejecuta un código distinto si la condición no cumple la prueba. La forma más sencilla de una instrucción if se puede escribir en una sola línea, pero se usan mucho más las instrucciones if e if...else de múltiples líneas.

Los siguientes ejemplos demuestran distintas sintaxis que puede usar con las instrucciones if e if...else. El primer ejemplo muestra el tipo de prueba Booleana más sencilla. Si (y sólo si) el elemento encerrado entre paréntesis da como resultado (o puede convertirse a) true, se ejecuta la instrucción o el bloque de instrucciones que sigue a la instrucción if.

// La función estrellar() se define en cualquier otra parte del código.
// Prueba de tipo Boolean para saber si barcoNuevo es true.
if (barcoNuevo)
   estrellar(botellaCava,proa); 

// En este ejemplo, la prueba no se cumple a menos que ambas condiciones sean verdaderas.
if (cascara.color == "amarillo oscuro" && cascara.textura == "arrugas grandes y pequeñas")
{
   laRespuesta = ("¿Es un melón?");
}

// En este ejemplo, la prueba se cumple si cualquiera de las condiciones es verdadera.
var laReaccion = "";
if ((dayOfWeek == "Sábado") || (dayOfWeek == "Domingo"))
{
   laReaccion = ("¡Me voy de vacaciones a la playa!");
}
else
{
   laRespuesta = ("¡Hi ho, hi ho, a casa a descansar!");
}

Operador condicional

JScript también admite una forma condicional implícita. Utiliza un signo de interrogación después de la condición que va a probar (en lugar de la palabra if antes de la condición). También especifica dos alternativas, una para usarla si la condición se cumple y otra para usarla si no se cumple. Dos puntos deben separar las alternativas.

var horas = "";

// Código que especifica que la variable horas tiene el contenido de
// laHora o laHora - 12.

horas += (laHora >= 12) ? " p.m." : " a.m.";

Si tiene que probar varias condiciones juntas y sabe que alguna tiene más posibilidades de cumplirse o de no cumplirse que las demás, puede utilizar la característica 'evaluación de cortocircuito' para acelerar la velocidad de ejecución de la secuencia de comandos. Cuando JScript evalúa una expresión lógica, sólo analiza el número de subexpresiones necesario para obtener un resultado.

Por ejemplo, si tiene una expresión 'And' como ((x == 123) && (y == 42)), JScript comprueba primero si x es igual a 123. Si esta condición no se cumple, la expresión no puede ser verdadera, aun cuando y sea igual a 42. En consecuencia, la comprobación de y no se realiza y JScript devuelve el valor false.

De forma similar, si de varias condiciones sólo una debe ser true (usando operadores ||), la prueba se detiene tan pronto como una condición cumple este requisito. Esto es particularmente efectivo si las condiciones que desea probar implican la ejecución de llamadas a funciones u otras expresiones complejas. Teniendo esto en cuenta, cuando escriba expresiones Or, sitúe en primer lugar las condiciones con mayor probabilidad de ser true. Cuando escriba expresiones And, sitúe en primer lugar las condiciones con mayor probabilidad de ser false.

Una de las ventajas de diseñar la secuencia de comandos de esta manera es que, en el siguiente ejemplo, ejecutarSegundo() no se ejecutará a menos que ejecutarPrimero() devuelva 0 o false.

if ((ejecutarPrimero() == 0) || (ejecutarSegundo() == 0)) {
    // algún código
}

Usar bucles

Hay diversas formas de ejecutar una instrucción o un bloque de instrucciones varias veces. En general, la ejecución repetitiva se llama ejecución en bucle o iteración. Una iteración es simplemente una ejecución única de un bucle. Normalmente se controla mediante la prueba de una variable cuyo valor cambia cada vez que se ejecuta el bucle. JScript admite cuatro tipos de bucles: los bucles for, for...in, while y do...while.

Usar bucles for

La instrucción for especifica una variable de contador, una condición de prueba y una acción que actualiza el contador. La condición se comprueba antes de cada iteración del bucle. Si la comprobación es correcta, se ejecuta el código interior del bucle. En caso contrario, el código interior del bucle no se ejecuta y el programa continúa por la primera línea de código inmediatamente posterior al bucle. Después de ejecutar el bucle, la variable de contador se actualiza antes de comenzar la siguiente iteración.

Si nunca se cumple la condición del bucle, éste nunca se ejecuta. Si la condición del bucle se cumple siempre, el bucle se convierte en un proceso infinito. Aunque es posible que lo primero sea necesario en algunos casos, lo segundo raramente lo es, por lo que debe tener cuidado al escribir las condiciones de los bucles.

/*
La expresión de actualización ("contadori++" en los siguientes ejemplos)
se ejecuta al final del bucle, después de que el bloque de instrucciones que forman el
cuerpo del bucle se ejecuta y antes de comprobar la condición.
*/

var limite = 10;  // Establece un límite de 10 en el bucle.

var suma = new Array(limite);  // Crea una matriz llamada suma con 10 miembros, desde 0 hasta 9.
var laSuma = 0;
suma[0] = 0;

for(var contadori = 0; contadori < limite; contadori++)  {        // En este caso, cuenta desde 0 hasta 9.
laSuma += contadori;
suma[contadori] = laSuma;
}

var nuevaSuma = 0;
for(var contadori= 0; contadori > limite; contadori++) { // Esto nunca se ejecuta, ya que contadori no es mayor que limite.
nuevaSuma += contadori;
}

var suma = 0;
for(var contadori = 0; contadori >= 0; contadori++) { // Esto es un bucle infinito.
suma += contadori;
}

Usar bucles for...in

JScript proporciona un tipo de bucle especial para examinar una a una todas las propiedades definidas por el usuario de un objecto o todos los elementos de una matriz. El contador del bucle en un bucle for...in es una cadena, no un número. Contiene el nombre de la propiedad actual o el índice del elemento de matriz actual.

El siguiente ejemplo de código debe ejecutarse desde dentro de Internet Explorer, ya que utiliza el método alert, que no forma parte de JScript.

// Crear un objeto con algunas propiedades
var miObjeto = new Object();
miObjeto.name = "Jaime";
miObjeto.age = "22";
miObjeto.phone = "555 1234";

// Enumere (itere)_todas las propiedades del objeto
for (prop in miObjeto)
{
    // Se muestra "El 'nombre' de propiedad es Jaime", etc.
    window.alert("La propiedad '" + prop + "' es " + miObjeto[prop]);
}

Aunque los bucles for...in son similares a los bucles For Each...Next de VBScript, no funcionan de la misma manera. El bucle for...in de JScript itera sobre propiedades de objetos de JScript. El bucle For Each...Next de VBScript itera sobre elementos de una colección. Para iterar sobre colecciones en JScript, es necesario utilizar el objeto Enumerator. Aunque algunos objetos, como los de Internet Explorer, admiten los bucles For Each...Next de VBScript y for...in de JScript, la mayoría de los objetos no los admiten.

Usar bucles while

El bucle while es muy parecido a un bucle for. La diferencia es que un bucle while no tiene integrada una variable de contador o una expresión de actualización. Si desea controlar la ejecución repetitiva de una instrucción o bloque de instrucciones, pero necesita una regla más compleja que "ejecutar este código n veces", use un bucle while. En el ejemplo siguiente se emplea el modelo de objetos de Internet Explorer y un bucle while para hacer al usuario una pregunta sencilla.

var x = 0;
while ((x != 42) && (x != null))
{
    x = window.prompt("¿Cuál es mi número favorito?", x);
}

if (x == null)
    window.alert("¡Te has dado por vencido!");
else
    window.alert("¡Exacto, esa es la respuesta definitiva!");
Nota   Debido a que los bucles while no tienen variables de contador explícitas integradas, son más vulnerables a crear bucles infinitos que otros tipos de bucles. Además, debido a que no es fácil descubrir dónde y cuándo se actualiza la condición del bucle, hay muchas posibilidades de escribir accidentalmente un bucle while en el que la condición nunca se actualice. Por este motivo, debe tener precaución al diseñar bucles while.

Como se especificó anteriormente, en JScript también hay un bucle do...while similar al bucle while, con la excepción de que se garantiza que se ejecuta siempre al menos una vez, ya que la condición se comprueba al final del bucle, en lugar de al principio. Por ejemplo, el bucle anterior puede volverse a escribir de la siguiente manera:

var x = 0;
do
{
    x = window.prompt("¿Cuál es mi número favorito?", x);
} while ((x != 42) && (x != null));

if (x == null)
    window.alert("¡Te has dado por vencido!");
else
    window.alert("¡Exacto, esa es la respuesta definitiva!");

Usar instrucciones break y continue

En Microsoft JScript, la instrucción break se puede usar para detener la ejecución de un bucle, si se cumple alguna condición. La instrucción break también se utiliza para salir de un bloque switch. La instrucción continue se puede usar para pasar inmediatamente a la siguiente iteración, saltando el resto del bloque de código y actualizando al mismo tiempo la variable de contador si el bucle es un bucle for o for...in.

El ejemplo siguiente toma como base el ejemplo anterior para usar las instrucciones break y continue a fin de controlar el bucle.

var x = 0;
do
{
    x = window.prompt("¿Cuál es mi número favorito?", x);

    // ¿Ha cancelado la acción el usuario? Si es así, sale del bucle
    if (x == null)
        break;

    // ¿Han escrito un número?
    // Si es así, no es necesario pedirles que escriban un número.
    if (Number(x) == x)
        continue;

    // Pide al usuario que sólo escriba números
    window.alert("Escriba únicamente números");

} while (x != 42)

if (x == null)
    window.alert("¡Te has dado por vencido!");
else
    window.alert("¡Exacto, esa es la respuesta definitiva!");
Ayuda de Javascript y Vbscript para Javascripts.astalaweb.com.