1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
|
---
title: switch
slug: Web/JavaScript/Referencia/Sentencias/switch
translation_of: Web/JavaScript/Reference/Statements/switch
---
<div>{{jsSidebar("Statements")}}</div>
<p>La <strong>declaración</strong> <code><strong>switch</strong></code> evalúa una <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Expressions_and_Operators">expresión</a>, comparando el valor de esa expresión con una instancia <code><strong>case</strong></code>, y ejecuta <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias">declaraciones</a> asociadas a ese <code>case</code>, así como las declaraciones en los <code>case</code> que siguen.</p>
<h2 id="Syntaxis">Syntaxis</h2>
<pre class="syntaxbox notranslate">switch (expresión) {
case valor1:
//Declaraciones ejecutadas cuando el resultado de expresión coincide con el valor1
[break;]
case valor2:
//Declaraciones ejecutadas cuando el resultado de expresión coincide con el valor2
[break;]
...
case valorN:
//Declaraciones ejecutadas cuando el resultado de expresión coincide con valorN
[break;]
default:
//Declaraciones ejecutadas cuando ninguno de los valores coincide con el valor de la expresión
[break;]
}</pre>
<dl>
<dt><code>expresión</code></dt>
<dd>Es una expresión que es comparada con el valor de cada instancia <code>case</code>.</dd>
<dt><code>case valorN</code></dt>
<dd>Una instancia <code>case valorN</code> es usada para ser comparada con la <code>expresión</code>. Si la <code>expresión</code> coincide con el <code>valorN</code>, las declaraciones dentro de la instancia <code>case</code> se ejecutan hasta que se encuentre el final de la declaración <code>switch</code> o hasta encontrar una interrupción <code>break</code>.</dd>
</dl>
<dl>
<dt><font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">default</span></font></dt>
<dd>Una instancia <code>default</code>, cuando es declarada, es ejecutada si el valor de la <code>expresión</code> no coincide con cualquiera de las otras instancias <code>case valorN</code>.</dd>
</dl>
<h2 id="Descripción">Descripción</h2>
<p>Si ocurre una coincidencia, el programa ejecuta las declaraciones 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.</p>
<p>El programa primero busca la primer instacia <code>case</code> cuya expresión se evalúa con el mismo valor de la expresión de entrada (usando <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators">comparación estricta</a>, <code>===)</code> y luego transfiere el control a esa cláusula, ejecutando las declaraciones asociadas. Si no se encuentra una cláusula de <code>case</code> coincidente, el programa busca la cláusula <code>default</code> opcional, y si se encuentra, transfiere el control a esa instancia, ejecutando las declaraciones asociadas. Si no se encuentra una instancia <code>default</code> el programa continúa la ejecución en la instrucción siguiente al final del <code>switch</code>. Por convención, la instancia <code>default</code> es la última cláusula, pero no tiene que ser así.</p>
<p>La declaración <code><a href="/en-US/docs/Web/JavaScript/Reference/Statements/break" title="JavaScript/Reference/Statements/break">break</a></code> es opcional y está asociada con cada etiqueta de <code>case</code> y asegura que el programa salga del <code>switch</code> una vez que se ejecute la instrucción coincidente y continúe la ejecución en la instrucción siguiente. Si se omite el <code>break</code> el programa continúa la ejecución en la siguiente instrucción en la declaración de <code>switch</code> .</p>
<h2 id="Ejemplos">Ejemplos</h2>
<h3 id="Usando_switch">Usando <code>switch</code></h3>
<p>En el siguiente ejemplo, si <code>expresión</code> se resuelve a "Platanos", el algoritmo compara el valor con el <code>case</code> "Platanos" y ejecuta la declaración asociada. Cuando se encuentra un <code>break</code>, el programa sale del condicional <code>switch</code> y ejecuta la declaración que lo procede. Si se omite el <code>break</code>, el <code>case</code> "Cerezas" también es ejecutado.</p>
<pre class="notranslate"><code>switch (expr) {
case 'Naranjas':
console.log('El kilogramo de naranjas cuesta $0.59.');
break;
case 'Manzanas':
console.log('El kilogramo de manzanas cuesta $0.32.');
break;
case 'Platanos':
console.log('El kilogramo de platanos cuesta $0.48.');
break;
case 'Cerezas':
console.log('El kilogramo de cerezas cuesta $3.00.');
break;
case 'Mangos':
case 'Papayas':
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?");</code></pre>
<h3 id="¿Qué_pasa_si_olvido_un_break">¿Qué pasa si olvido un break?</h3>
<p>Si olvidas un <code>break</code>, el script se ejecutará desde donde se cumple la condición y ejecutará el siguiente <code>case</code> independientemente si esta condición se cumple o no. Ver el siguiente ejemplo:</p>
<pre class="brush: js notranslate">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');
}
</pre>
<h3 id="¿Puedo_usar_un_<default>_entre_condiciones">¿Puedo usar un <default> entre condiciones?</h3>
<p>Si, ¡es posible! JavaScript retornará a la instancia <code>default</code> en caso de no encontrar una coincidencia:</p>
<pre class="notranslate"><code>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');
}</code></pre>
<p>Al estar el <code>case 1:</code> a continuación de <code>default</code>, y al no haber un <code>break </code>de por medio, veremos que la declaración del <code>case 1:</code> será ejecutada, apareciendo el resultado <code>1</code> en el <em>log de consola.</em></p>
<h3 id="Metodos_para_casos_con_multiple-criterio">Metodos para casos con multiple-criterio</h3>
<p>La fuente de esta técnica esta aquí:</p>
<p><a href="http://stackoverflow.com/questions/13207927/switch-statement-multiple-cases-in-javascript">Switch statement multiple cases in JavaScript (Stack Overflow)</a></p>
<h4 id="Operación_única_con_múltiples_casos">Operación única con múltiples casos</h4>
<p>Este método toma ventaja del hecho de que, si no hay un <code>break</code> debajo de una declaración <code>case</code>, continuará la ejecución hasta el siguiente <code>case</code>, ignorando si en dicho caso se cumple o no el criterio indicado. Comprobar en la sección <em>¿Qué pasa si olvido un <code>break</code>?</em></p>
<p>Este es un ejemplo de operación única con sentencia <code>switch</code> secuencial, donde cuatro valores diferentes se comportan exactamente de la misma manera:</p>
<pre class="brush: js notranslate">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á.');
}</pre>
<h4 id="Operaciones_encadenadas_con_múltiples_casos">Operaciones encadenadas con múltiples casos</h4>
<p>Este es un ejemplo de una sentencia <code>switch</code> 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 declaraciones <code>case</code>, y que no tiene que ser numéricamente secuencial. En JavaScript, también es posible combinar definiciones con valores <em><code>"string"</code> </em>dentro de estas declaraciones <code>case</code>.</p>
<pre class="brush: js notranslate">var foo = 1;
var output = '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(output);
break;
case 5:
output += '!';
console.log(output);
break;
default:
console.log('Por favor, selecciona un valor del 1 al 6.');
}</pre>
<p>La salida(output) de este ejemplo:</p>
<table class="standard-table" style="height: 270px; width: 522px;">
<tbody>
<tr>
<th scope="col">Value</th>
<th scope="col">Log text</th>
</tr>
<tr>
<td>foo es NaN or no es 1, 2, 3, 4, 5 ni 10</td>
<td>Por favor, selecciona un valor del 1 al 6.</td>
</tr>
<tr>
<td>10</td>
<td>Salida: ¿Y Cuál Es Tu Nombre?</td>
</tr>
<tr>
<td>1</td>
<td>Salida: Cuál Es Tu Nombre?</td>
</tr>
<tr>
<td>2</td>
<td>Salida: Tu Nombre?</td>
</tr>
<tr>
<td>3</td>
<td>Salida: Nombre?</td>
</tr>
<tr>
<td>4</td>
<td>Salida: ?</td>
</tr>
<tr>
<td>5</td>
<td>Salida: !</td>
</tr>
</tbody>
</table>
<h3 id="Variables_centradas_en_bloques_sin_un_estamento_de_switch">Variables centradas en bloques sin un estamento de switch</h3>
<p>Con ECMAScript 2015 (ES6) </p>
<h2 id="Compatibilidad_en_Navegadores">Compatibilidad en Navegadores</h2>
<p>{{CompatibilityTable}}</p>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Basic support</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<h2 id="Ver_también">Ver también</h2>
<ul>
<li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/if...else"><code>if...else</code></a></li>
</ul>
|