74

Tengo una variable que puede ser booleana false o un número entero (incluido 0). Quiero ponerlo en una sentencia switch como:¿Es seguro asumir una comparación estricta en una declaración de cambio de JavaScript?

switch(my_var){ 
    case 0: 
     // Do something 
     break; 
    case 1: 
     // Do something else 
     break; 
    case false: 
     // Some other code 
} 

En mis pruebas en Google Chrome, parece que funciona perfectamente, pero estoy un poco nervioso a usarlo porque me temo que en algunos navegadores , si my_var es false, podría ejecutar el primer caso desde 0 == false.

Me pregunto si hay algo oficial en JavaScript que diga que la instrucción switch usará una comparación estricta como 0 !== false, pero no puedo encontrar nada, y no estoy seguro si esto funcionará bien en diferentes motores de JavaScript. ¿Alguien sabe si se garantiza que la comparación hecha por una declaración switch es estricta?

Respuesta

71

Eche un vistazo a ECMA 262, section 12.11, el segundo algoritmo, 4.c.

c. Si la entrada es igual a clauseSelector como se define por el operador ===, entonces ...

+5

Ha estado [de fiesta así desde 1999] (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition, % 20Diciembre% 201999.pdf) (página 68, s 12.11, CaseBlock # 3) – Walf

25

http://qfox.nl/notes/110 responde a tu pregunta. (Este tipo sabe mucho sobre los detalles de JavaScript)

Los modificadores en Javascript usan la verificación de tipo estricta (===). Por lo tanto, nunca tiene que preocuparse por la coerción, lo que evita unos cuantos wtfjs :). Si en el otra mano, usted estaba contando con la coerción, la suerte difícil porque no puede forzarla .

+0

https://jsfiddle.net/to469fLm/4/, usted podría generalice la función de coerción para lograr sus necesidades – darethas

33

Práctica:

switch(1) { 
    case '1': 
    alert('Switch comparison is NOT strict.'); 
    break; 
    case 1: 
    alert('Switch comparison is strict.'); 
    break; 
    default: 
    alert('Huh?'); 
} 
+6

Suspiro, nunca me acostumbraré a los votos abajo. –

+15

Bueno, la razón por la que recibo los votos atrasados ​​es que, para que esto responda a la pregunta, tendría que probarlo en cada motor de JavaScript que posiblemente podría ejecutar su aplicación o biblioteca de JavaScript, que puede ser mucho. Sin embargo, soy un gran fan de probar incluso la funcionalidad principal. No importa cuán autorizada sea una pieza de documentación, realmente no puede garantizar que todas las implementaciones principales sean conformes, y la forma más segura de averiguarlo es poner a prueba. –

+1

Volví a subir tu segundo comentario, porque tienes razón, probar es importante. Y como desarrollador, me haré responsable de que el código funcione en un determinado conjunto de navegadores, aquellos que sé que han sido probados. OTOH, si no podemos confiar en la documentación autorizada, ¿cuál es el sentido de stackoverflow.com? (Y a pesar de que no le da credibilidad, con suerte un votante más hará su día). (De todos modos, ya tiene un poco más de credibilidad que yo). –

Cuestiones relacionadas