2011-10-10 3 views
7

Ho un bug piuttosto strano che si verifica nella mia applicazione JS su base casuale. Fondamentalmente, lo script non riesce a confrontare accuratamente due stringhe. Più in particolare, a volte non vengono visualizzate due stringhe identiche come identiche: ('blah' == 'blah') restituisce false.Confronto di stringhe JavaScript non riuscito casualmente

La cosa divertente è che in un altro tentativo, le stesse due stringhe possono essere ammesse per essere identiche (dichiarazione restituisce true). Non sono mai riuscito a capire il modello. Ho anche provato a utilizzare === anziché ==; questo non ha aiutato.

Non riuscivo a pensare a un modo migliore per dimostrare e dimostrare questo ridicolo bug se non registrando uno screencast. Quindi eccolo: http://www.screenr.com/klOs. Continuo a dare risposte corrette per ogni quiz in quel video, ma più vicino alla fine vedrai come le mie risposte per "Giappone" e "Taiwan" saranno considerate "sbagliate"; la console mostrerà anche la stringa di risposta data, la stringa di risposta corretta e il risultato del loro confronto (false? !!).

Quindi quale potrebbe essere la ragione di questo strano comportamento e come faccio a risolverlo?

È possibile visualizzare il codice con l'istruzione di confronto nello screencast. Il ‘params.givenAnswer’ proviene direttamente dall'etichetta testo del pulsante:

//*** 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 
    }); 
}, 

UPDATE Grazie @JAAulde e @ Mike! Ho cercato di includere le virgolette e il tipo var nella registrazione e ho ottenuto questo risultato:

enter image description here

Ora è chiaro perché il confronto di stringhe fallisce: non ci sembra essere un interruzione di linea in più di sorta in la prima stringa. È ancora molto strano, dal momento che non è apparso come una nuova riga vuota nella registrazione precedente e, soprattutto, appare casualmente (notare come 'Taiwan' sia stata accettata questa volta senza problemi).

Ho incluso una semplice regola di rimozione della linea per le stringhe di risposta, e ora tutto sembra funzionare correttamente. Grazie mille a tutti!

+0

Lo screencast non chiarisce che i valori sono 'stringa's e non' String's o 'Object's con un metodo' toString'. Forse il tuo logging dovrebbe includere il 'typeof' dei valori che vengono confrontati. –

+2

Regola la tua registrazione in modo che le stringhe che vengono emesse siano racchiuse tra virgolette: 'console.log ('"' + value + '"');' Potrebbe darsi che tu abbia qualche problema di spazio bianco. La registrazione di 'typeof' sarebbe anche utile. – JAAulde

+1

È molto strano. Stai mixando codifiche (ISO-8859-1, UTF-8) o qualcosa del genere? Ho provato a eseguire '.toString()' su entrambi prima del confronto? –

risposta

0

L'utilizzo di === è un confronto di uguaglianza rigoroso. Ciò significa che il tipo di dati e il contenuto vengono confrontati. Entrambi (dati e tipo) devono essere uguali e restituire true.

Quando è stato eseguito il confronto rigoroso con ==, il test avrebbe dovuto funzionare anche se i tipi di dati erano diversi. Ha fallito tuttavia a causa degli spazi in più.