chaimp
chaimp

Reputation: 17847

Javascript String Compare == sometimes fails

How could the following code sometimes evaluate to false?

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

My JavaScript code:

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
}

What could cause JavaScript string compare == to return false when the strings are identical?

Upvotes: 38

Views: 123295

Answers (11)

Russo
Russo

Reputation: 2992

export const isEqualStr = (str1: any, str2: any): boolean => 
 (str1 + '').trim().toLowerCase() === (str2 + '').trim().toLowerCase();

Upvotes: -1

Rafiq
Rafiq

Reputation: 11465

casting worked for me

if (timeSlots[j].id + '' == product.timeSlots[k].id + '') {
}

Upvotes: 1

Yatharth Varshney
Yatharth Varshney

Reputation: 2103

I would advice you to use normalization preferably "NFKC" or "NFKD" as these seem to normalize non-breaking space into regular space.

So you can write your code as :-

string1.normalize("NFKC") === string2.normalize("NFKC")

Upvotes: 5

Ahmed Younes
Ahmed Younes

Reputation: 1134

I had the same problem and i noticed that i was comparing two objects

enter image description here

to solve this issue i had to use

JSON.stringify(user._id) === JSON.stringify(userId) // true 

Upvotes: 7

Kaj Risberg
Kaj Risberg

Reputation: 645

Java servlet may send strings i.e.

out.println("CARD_VALID");

or

out.print("CARD_VALID");

These may look identical in Javascript, but there are white spaces at the end in the first case.

Upvotes: 0

Lightlion
Lightlion

Reputation: 181

A1 = "speed"
A2 = "speed" 

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

USE THIS TEST IN CONSOLE:

escape("speed")

result: "speed"

escape(A1)

result: "speed%0D" => This is the problem %0D !!!

escape(A2)

result: "speed" => OK !!!

Use correct code:

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

Upvotes: 18

Jamisco
Jamisco

Reputation: 1862

If you want something a little less complicated and you are dealing with NUMERIC VALUES, use

parseFloat()

works like a charm

Upvotes: 3

sat
sat

Reputation: 41076

Try using === to match exactly (type and value). This is the recommended comparison operator in javascript.

Check the datatypes of the strings to make sure, and look for hidden unicode or control characters in both strings.

Upvotes: 6

Jacob
Jacob

Reputation: 734

Double equals is the appropriate way to compare strings in Javascript, it is returning false then there may be whitespace to the left and or right of one string.

Put a .trim() on the end of the strings and my comparison should started working:

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

Upvotes: 71

Robert
Robert

Reputation: 15726

I had a similar problem where two obviously identical strings would not be equal, and I was pulling my hair out trying to solve it, so I did this:

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;
    }
}

And I found that the last character on one string was 10, and the last character on the other was 13, I thought both strings were null terminated, but they were not.

Upvotes: 17

Joel Coehoorn
Joel Coehoorn

Reputation: 415830

Try capturing the value of responseText into a different variable before entering that code block, in case the variable is updated somewhere in there.

I don't have that much experience directly using XmlHttpRequest, but I do know that javascript has a number of places where it uses volatile references to interface objects that can change during execution, rather than a simple value.

Upvotes: 2

Related Questions