web-dev-qa-db-fra.com

Javascript String Compare == échoue parfois

Comment le code suivant peut-il parfois être évalué à false?

(transport.responseText == '1' || 
 transport.responseText == 'CARD_VALID')

Mon code JavaScript:

if (transport.responseText == '1' || 
    transport.responseText == 'CARD_VALID') {
    // do something.
}
else if (transport.responseText == 'CARD_INVALID' || 
             transport.responseText == 'INVALID_CHECKSUM') {
    // do something else....
}
else {
    new Ajax.Request('/report_error.php?responseText='+transport.responseText);
    // report error to user
}

Qu'est-ce qui pourrait faire en sorte que la chaîne JavaScript compare == renvoie false lorsque les chaînes sont identiques?

26
chaimp

Double equals est le moyen approprie pour comparer des chaines en Javascript, il retourne false alors il peut y avoir des espaces a gauche ou a droite d'une chaine.

Mettez une .trim() à la fin des chaînes et ma comparaison devrait commencer à fonctionner:

var panel = response.substr(0, response.indexOf("<")).trim();
if(panel == "combo"){
    //do something
}
40
Jacob

J'ai eu un problème similaire où deux chaînes évidemment identiques ne seraient pas égales, et je me tirais les cheveux en essayant de le résoudre, alors j'ai fait ceci:

for (var c=0; c<string_1.length; c++) {
    if (string_1.charCodeAt(c) != string_2.charCodeAt(c)) {
        alert('c:'+c+' '+string_1.charCodeAt(c)+'!='+string_2.charCodeAt(c));
        valid = false;
    }
}

Et j'ai trouvé que le dernier caractère sur une chaîne était 10, et le dernier caractère sur l'autre était 13, je pensais que les deux chaînes étaient terminées par zéro, mais elles ne l'étaient pas.

11
Robert
A1 = "speed"
A2 = "speed" 

if(A1 == A2)  => Error !!!

UTILISEZ CE TEST EN CONSOLE:

escape("speed")

résultat: "speed"

escape(A1)

résultat: "speed% 0D" => C'est le problème% 0D !!!

escape(A2)

résultat: "speed" => OK !!!

Utilisez le code correct:

if(A1.slice(0, -1) == A2) This is OK!
4
Lightlion

Essayez d'utiliser === pour faire correspondre exactement (type et valeur). C'est l'opérateur de comparaison recommandé en javascript.

Vérifiez les types de données des chaînes pour vous en assurer et recherchez les caractères Unicode ou de contrôle cachés dans les deux chaînes. 

4
sat

Essayez de capturer la valeur de responseText dans une variable différente avant de saisir ce bloc de code, au cas où la variable serait mise à jour quelque part.

Je n'ai pas beaucoup d'expérience directe avec XmlHttpRequest, mais je sais que javascript utilise un certain nombre d'endroits où il utilise des références volatiles aux objets d'interface pouvant changer au cours de l'exécution, plutôt qu'une simple valeur.

2
Joel Coehoorn

Si vous voulez quelque chose de moins compliqué et que vous avez affaire à des valeurs numériques, utilisez 

parseFloat()

fonctionne comme un charme

1
Jamisco

Le servlet Java peut envoyer des chaînes i.e.

out.println ("CARD_VALID");

ou

out.print ("CARD_VALID");

Ceux-ci peuvent sembler identiques en Javascript, mais il y a des espaces à la fin dans le premier cas.

0
Kaj Risberg