2011-10-10 20 views
7

Tengo un error bastante extraño que ocurre en mi aplicación JS de forma aleatoria. Básicamente, la secuencia de comandos no puede comparar con precisión dos cadenas. Más específicamente, a veces no ve dos cadenas idénticas como idénticas: ('blah' == 'blah') devuelve false.La comparación de cadenas de JavaScript falla aleatoriamente

Lo curioso es que en otro intento, las mismas dos cadenas pueden admitirse como idénticas (la declaración devuelve true). Nunca logré descubrir el patrón. También intenté usar === en lugar de ==; esto no ayudó.

No pude pensar en una mejor manera de demostrar y probar este error ridículo que no sea la grabación de un screencast. Así que aquí está: http://www.screenr.com/klOs. Sigo dando respuestas correctas para cada prueba en ese video, pero más cerca del final verás cómo mis respuestas para 'Japón' y 'Taiwán' serán consideradas 'incorrectas'; la consola también mostrará la cadena de respuesta dada, la cadena de respuesta correcta y el resultado de su comparación (false? !!).

Entonces, ¿cuál podría ser el motivo de este extraño comportamiento y cómo puedo solucionarlo?

Puede ver el código con la instrucción de comparación en el screencast. El ‘params.givenAnswer’ viene directamente de la etiqueta de texto del botón:

//*** Options for answering the card quiz 
quizOptions = new Ext.Panel({ 
     id: 'quizOptions', 
     […………] 
     listeners: { 
      el: { 
       scope: this, 
       tap: this.checkAnswer 
      } 
     } 
}); 


checkAnswer: function(container, element) { 

    // Get the text value of the button clicked 
    var answer = Ext.fly(element).dom.innerText; 

    Ext.dispatch({ 
     controller: 'Practice', 
     action: 'checkAnswer', 
     givenAnswer: answer 
    }); 
}, 

ACTUALIZACIÓN Gracias @JAAulde y @ Mike! He tratado de incluir las comillas y el tipo var en el registro y me dieron este resultado:

enter image description here

Ahora está claro por qué la comparación de cadenas no: parece que hay un salto de línea extra de clases en la primera cuerda Todavía es muy extraño, ya que no apareció como una nueva línea en blanco en el registro anterior, y lo más importante, aparece allí al azar (observe cómo 'Taiwán' fue aceptado esta vez sin ningún problema).

He incluido una regla de eliminación de salto de línea simple para las cadenas de respuestas, y ahora todo parece estar funcionando bien. Muchas gracias a todos!

+0

El screencast no deja claro que los valores son 'string's y no' String's o 'Object's con un método' toString'. Tal vez su registro debe incluir el 'typeof' de los valores que se comparan. –

+2

Ajuste su registro de manera que las cadenas que se envían estén entre comillas: 'console.log ('"' + value + '"');' Podría ser que tenga problemas con el espacio en blanco. El registro 'typeof' sería bueno también. – JAAulde

+1

Eso es muy extraño. ¿Estás mezclando codificaciones (ISO-8859-1, UTF-8) o algo así? ¿Intentó ejecutar '.toString()' en ambos antes de la comparación? –

Respuesta

0

Usar === es una comparación de igualdad estricta. Esto significa que el tipo de datos y los contenidos se están comparando. Ambos (datos y tipo) deben ser iguales para ser iguales y regresar verdaderos.

Cuando cambió su comparación estricta a == la prueba debería haber funcionado aunque los tipos de datos fueran diferentes. Sin embargo, falló debido a los espacios en blanco adicionales.

Cuestiones relacionadas