Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

La sentencia switch evalúa una expresión, comparando el valor de esa expresión con una instancia case, y ejecuta sentencias asociadas a ese case, así como las sentencias en los case que siguen.

Syntax

switch (expresion) {
  case valor1:
    //Sentencias ejecutadas cuando el resultado de expresion coincide con valor1
    [break;]
  case valor2:
    //Sentencias ejecutadas cuando el resultado de expresion coincide con valor2
    [break;]
  ...
  case valorN:
    //Sentencias ejecutadas cuando el resultado de expresion coincide con valorN
    [break;]
  default:
    //Sentencias_def ejecutadas cuando no ocurre una coincidencia con los anteriores casos
    [break;]
}
expresion
Es una expresión que es comparada con el valor de cada instancia case.
case valorN
Es un valor a comparar con la expresion.
sentenciasN
Son porciones de código que se ejecutarán únicamente en el caso de que la expresión coincida con el valorN associado a la sección case.
sentencias_def
Son porciones de código que se ejecutarán si ningún valorN coincide con expresion.

Descripción

Si ocurre una coincidencia, el programa ejecuta las sentencias asociadas correspondientes. Si la expresión coincide con múltiples entradas, la primera será la seleccionada, incluso si las mayúsculas son tenidas en cuenta.

El programa primero busca la primer cláusula case cuya expresión se evalúa con el mismo valor de la expresión de entrada (usando comparación estricta, ===) y luego transfiere el control a esa cláusula, ejecutando las declaraciones asociadas. Si no se encuentra una cláusula de case coincidente, el programa busca la cláusula default opcional, y si se encuentra, transfiere el control a esa cláusula, ejecutando las declaraciones asociadas. Si no se encuentra una cláusula default  el programa continúa la ejecución en la instrucción siguiente al final del switch. Por convención, la cláusula default es la última cláusula, pero no tiene que ser así.

La declaración de break opcional asociada con cada etiqueta de caso asegura que el programa salga del conmutador una vez que se ejecute la instrucción coincidente y continúe la ejecución en la instrucción siguiente al cambio. Si se omite el  break  el programa continúa la ejecución en la siguiente instrucción en la declaración de switch .

Ejemplos

Usando switch

En el siguiente ejemplo, si expresion se resuelve a "Banana", el algoritmo compara el valor con el case "Banana" y ejecuta la declaración asociada. Cuando se encuentra un break, el programa sale del condicinoal switch y ejecuta la declaración que lo procede. Si se omite el break, el case "Cereza" también es ejecutado.

switch (expr) {
  case 'Naranja':
    console.log('El kilogramo de Naranjas cuesta $0.59.');
    break;
  case 'Manzana':
    console.log('El kilogramo de Manzanas cuesta $0.32.');
    break;
  case 'Banana':
    console.log('El kilogramo de Bananas cuesta $0.48.');
    break;
  case 'Cereza':
    console.log('El kilogramo de Cerezas cuesta $3.00.');
    break;
  case 'Mango':
  case 'Papaya':
    console.log('El kilogramo de Mangos y Papayas cuesta $2.79.');
    break;
  default:
    console.log('Lo lamentamos, por el momento no disponemos de ' + expr + '.');
}

console.log("¿Hay algo más que te quisiera consultar?");

¿Qué pasa si olvido un break?

Si olvidas un break, el script se ejecutará desde donde se cumple la condición y ejecutará el siguiente case independientemente si esta condición se cumple o no. Ver el siguiente ejemplo:

var foo = 0;
switch (foo) {
  case -1:
    console.log('1 negativo');
    break;
  case 0: // foo es 0, por lo tanto se cumple la condición y se ejecutara el siguiente bloque
    console.log(0)
    // NOTA: el "break" olvidado debería estar aquí
  case 1: // No hay sentencia "break" en el 'case 0:', por lo tanto este caso también será ejecutado
    console.log(1);
    break; // Al encontrar un "break", no será ejecutado el 'case 2:'
  case 2:
    console.log(2);
    break;
  default:
    console.log('default');
}

¿Puedo usar un <default> entre condiciones?

Si, ¡es posible! JavaScript retornará a ese default en caso de no encontrar una igualdad:

var foo = 5;
switch (foo) {
  case 2:
    console.log(2);
    break; // al encontrar este 'break' no se continuará con el siguiente 'default:'
  default:
    console.log('default')
    // fall-through
  case 1:  
    console.log('1');
}

Al estar el case 1: a continuación de default, y al no haber un break de por medio, veremos que la sentencia del case 1: será ejecutada, apareciendo el resultado 1 en el log de consola.

Metodos para casos con multiple-criterio

La fuente de esta técnica esta aqui:

Switch statement multiple cases in JavaScript (Stack Overflow)

Operación única con multiples casos

Este método toma ventaja en el hecho de que, si no hay un break debajo de una sentencia case, continuará la ejecución hasta el siguiente case, ignorando si en dicho caso se cumple o no el criterio indicado. Comprobar en la sección ¿Que pasa si olvido un <break>?

Este es un ejemplo de operación única con sentencia switch secuencial, donde cuatro valores diferentes se comportan exactamente de la misma manera:

var Animal = 'Jirafa';
switch (Animal) {
  case 'Vaca':
  case 'Jirafa':
  case 'Perro':
  case 'Cerdo':
    console.log('Este animal subirá al Arca de Noé.');
    break;
  case 'Dinosaurio':
  default:
    console.log('Este animal no lo hará.');
}

Operaciones encadenadas con múltiples casos

Este es un ejemplo de una sentencia switch secuencial con múltiples operaciones, donde, dependiendo del valor entero dado, se pueden recibir diferentes resultados. Esto demuestra que el algoritmo correrá en el orden en que se coloquen las sentencias case, y que no tiene que ser numéricamente secuencial- En JavaScript, también es posible combinar definiciones con valores string dentro de estas sentencias case.

var foo = 1;
var salida = 'Salida: ';
switch (foo) {
  case 10:
    output += '¿Y ';
  case 1:
    output += 'Cuál ';
    output += 'Es ';
  case 2:
    output += 'Tu ';
  case 3:
    output += 'Nombre';
  case 4:
    output += '?';
    console.log(salida);
    break;
  case 5:
    output += '!';
    console.log(salida);
    break;
  default:
    console.log('Por favor, selecciona un valor del 1 al 6.');
}

Output from this example:

Value Log text
foo es NaN or no es 1, 2, 3, 4, 5 ni 10 Por favor, selecciona un valor del 1 al 6.
10 Salida: ¿Y Cuál Es Tu Nombre?
1 Salida: Cuál Es Tu Nombre?
2 Salida: Tu Nombre?
3 Salida: Nombre?
4 Salida: ?
5 Salida: !

Especificaciones

Specification Status Comment
ECMAScript 3er. Edición Standard Initial definition.
Implemented in JavaScript 1.2
ECMAScript 5.1 (ECMA-262)
La definición de 'switch statement' en esta especificación.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
La definición de 'switch statement' en esta especificación.
Standard  

Compatibilidad en Navegadores

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Ver también

Etiquetas y colaboradores del documento

Última actualización por: SSantiago90,