2008-10-30 7 views
10

Tengo un problema en JavaScript que estoy escribiendo en el que la instrucción Switch parece no funcionar como se esperaba.Declaración de cambio de JavaScript

switch (msg.ResultType) { 
    case 0: 
    $('#txtConsole').val("Some Val 0"); 
    break; 
    case 1: 
    $('#txtConsole').val("Some Val 1"); 
    break; 
    case 2: 
    $('#txtConsole').text("Some Val 2"); 
    break; 
} 

El Tipo de resultado es un valor entero 0-2 y puedo verlo en FireBug. En todos los casos, el conmutador transfiere el control a la declaración de interrupción final, lo que significa que se omite por completo toda la lógica. ¿Qué me estoy perdiendo?

Respuesta

19

Estoy seguro de que un conmutador utiliza === para la comparación en Actionscript y desde JS y AS ambos siguen el estándar ECMAScript, supongo que lo mismo se aplica a JS. Mi suposición es que el valor no es realmente un Número, sino quizás una Cadena.

Puede intentar usar parseInt (msg.ResultType) en el modificador o usar cadenas en los casos.

+8

¡SIEMPRE especifique el segundo parámetro para analizar! Es la raíz, es muy probable que quieras: parseInt (msg.ResultType, 10); Si no lo proporciona, intentará adivinar la raíz y sucederán cosas horribles. – rmeador

+0

Bueno, cosas horribles solo sucederán si pasa algo como 077, que se interpretará como octal (pero no 078, por ejemplo), o 0x10, pero en el segundo caso está bastante claro que tiene la base 16. De todos modos, agregando el radix explícitamente no duele, por lo que tampoco es una mala idea. –

+0

En este caso, el radix no es necesario, aunque lo he usado solo para mayor claridad e integridad. No soy alguien que cree que el código es el mejor código. Los valores entrantes se definen en una enumeración en el lado del servidor y, por lo tanto, nunca estarán en un formato no estándar. –

2

Me encontré con un problema similar y el problema resultó ser que cuando se mostraba como un valor int, la instrucción switch lo estaba leyendo como una variable de cadena. Puede que no sea el caso aquí, pero eso es lo que me sucedió a mí.

0

¿Estás seguro de que ResultType es un número entero (por ejemplo, 0) y no una cadena (por ejemplo, "0")?

Esto fácilmente podría explicar la diferencia en el comportamiento

+0

Definitivamente fue un entero de acuerdo con FireBug. No es que sea la fuente definitiva, sino un indicador bastante bueno. –

0

Parece que cambiarlo a parseInt (msg.ResultType) forzó al motor de JavaScript a tratarlo como un entero. Gracias por la ayuda.

2

Prueba esto:

switch (msg.ResultType-0) { 
    case 0: 
    $('#txtConsole').val("Some Val 0"); 
    break; 
    case 1: 
    $('#txtConsole').val("Some Val 1"); 
    break; 
    case 2: 
    $('#txtConsole').text("Some Val 2"); 
    break; 
} 

El -0 obligará (coaccionar) para el tratamiento de su valor como un entero sin cambiar el valor, y es mucho más corto que parseInt.

+0

Esta es una de esas respuestas que es resbaladiza, pero no tan explicativa como usar parseInt. –

+0

Y presumiblemente, Javascript solo llamará a parseInt detrás de las escenas, por lo que todo lo que estamos guardando es un poco de tipeo. –

+0

Intenté esto y no funcionó. Todavía terminé con el problema original. El parseInt (con y sin radix) funcionó de manera confiable. –

0

Lo primero que noté es que en dos de los tres casos, está llamando a .val() y en el tercero está llamando a .text().

Si trataste de cambiar los enunciados de mayúsculas a cadenas en lugar de enteros, entonces lo único que puedo pensar es que estás golpeando una excepción en alguna parte de la línea posiblemente causada por acceder a una variable indefinida.

0

Probablemente la más poderosa coacción a int disponible en ES5 es:

 msg.ResultType | 0 

Ésta es una de las piedras angulares en la que reside el asm.js. Esto conduce a muy ES5 optimizado y se utiliza mediante la compilación en presencia de:

"use asm" 

Directiva (en FF y cromo). Esta coerción hace que el tipo Int32 se use para Números en ES5 que sí representan un "int". Así que la solución receta de libro de cocina de la pregunta original de hace 5 años es la siguiente:

"use strict" ; 
$("#txtConsole").val(
    switch (msg.ResultType | 0) { 
    case 0: 
      "Some Val 0"; 
    break; 
    case 1: 
     "Some Val 1"; 
    break; 
    case 2: 
     "Some Val 2"; 
    break; 
    default : 
     "Illegal ResultType"; 
    }); 
Cuestiones relacionadas