What is the correct way to check for equality between Strings in JavaScript?
10 Answers
always Until you fully understand the differences and implications of using the == and === operators, use the === operator since it will save you from obscure (non-obvious) bugs and WTFs. The "regular" == operator can have very unexpected results due to the type-coercion internally, so using === is always the recommended approach.
For insight into this, and other "good vs. bad" parts of Javascript read up on Mr. Douglas Crockford and his work. There's a great Google Tech Talk where he summarizes lots of good info: http://www.youtube.com/watch?v=hQVTIJBZook
Update:
The You Don't Know JS series by Kyle Simpson is excellent (and free to read online). The series goes into the commonly misunderstood areas of the language and explains the "bad parts" that Crockford suggests you avoid. By understanding them you can make proper use of them and avoid the pitfalls.
The "Up & Going" book includes a section on Equality, with this specific summary of when to use the loose (==) vs strict (===) operators:
To boil down a whole lot of details to a few simple takeaways, and help you know whether to use
==or===in various situations, here are my simple rules:
- If either value (aka side) in a comparison could be the
trueorfalsevalue, avoid==and use===.- If either value in a comparison could be of these specific values (
0,"", or[]-- empty array), avoid==and use===.- In all other cases, you're safe to use
==. Not only is it safe, but in many cases it simplifies your code in a way that improves readability.
I still recommend Crockford's talk for developers who don't want to invest the time to really understand Javascript—it's good advice for a developer who only occasionally works in Javascript.
18 Comments
if (typeof foo == "string")=== operator and never have to worry about the "am I really, totally, 100% certain that == will behave how I think it will?"++/--).++ or -- or single line if/else statements or continue or the new operator or any other number of perfectly legitimate code practices that Crockford has deemed "harmful". And of course never ever even consider thinking about using eval or with even if their pitfalls are well understood. And have you seen the next version of JS? Stricter syntax and a handful of helper functions, some which have been floating around for years, is about all we get after all this time. The syntax has not evolved at all. If Crockford is behind this, then it has been a bad thing.If you know they are strings, then there's no need to check for type.
"a" == "b"
However, note that string objects will not be equal.
new String("a") == new String("a")
will return false.
Call the valueOf() method to convert it to a primitive for String objects,
new String("a").valueOf() == new String("a").valueOf()
will return true
6 Comments
new String("a") == "a" is true (but wouldn't be with ===), because the left hand side will be converted into a primitive string value.new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a") will all return false, since you're dealing with references to objects of the String class, not primitives of type string.new String(foo) creates a string object, and String(foo) converts foo to a string primitive.You can use == or === but last one works in more simple way (src)
a == b (and its negation !=)
a === b (and its negation !==)
6 Comments
if("0"==0 && 0==[]) console.log("0"==[]);Just one addition to answers: If all these methods return false, even if strings seem to be equal, it is possible that there is a whitespace to the left and or right of one string. So, just put a .trim() at the end of strings before comparing:
if(s1.trim() === s2.trim())
{
// your code
}
I have lost hours trying to figure out what is wrong. Hope this will help to someone!
9 Comments
fetch). Thanks a lot.what led me to this question is the padding and white-spaces
check my case
if (title === "LastName")
doSomething();
and title was " LastName"
so maybe you have to use
trimfunction like this
var title = $(this).text().trim();
3 Comments
.toString().trim() in TypescriptThere are actually two ways in which strings can be made in javascript.
var str = 'Javascript';This creates a primitive string value.var obj = new String('Javascript');This creates a wrapper object of typeString.typeof str // string
typeof obj // object
So the best way to check for equality is using the === operator because it checks value as well as type of both operands.
If you want to check for equality between two objects then using String.prototype.valueOf is the correct way.
new String('javascript').valueOf() == new String('javascript').valueOf()
Comments
String Objects can be checked using JSON.stringify() trick.
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
2 Comments
Strict Comparisons
To do simple comparison, use === to check for strict equality. As others stated, this has the advantages of being most efficient and reducing the chances of buggy or uncertain code. Source: MDN Web Docs: Strict Equality.
var a = "hello1";
var b = "hello2";
console.log("a === a?" + (a === a) + "|");
console.log("a === b?" + (a === b) + "|");
Alphabetical Comparisons
If you want to compare two strings to know if a string comes before or after another string, based on natural sorting, use the <, >, <=, and >= operators. Source: MDN WebDocs for <, >, <=, and >=.
var a = "hello1";
var b = "hello2";
console.log("a < a?" + (a < a) + "|");
console.log("a < b?" + (a < b) + "|");
console.log("a > b?" + (a > b) + "|");
console.log("b > a?" + (b > a) + "|");
Comments
For strings, we have a supported method localCompare which is very handy in string comparison. IMO, we should just use it and doesn't need to complicate stuff.
Usage:
const a = 'Hello'
const b = 'Hell'
a.localCompare(a) // 0
a.localCompare(b) // 1
b.localCompare(a) // -1
3 Comments
if (stringA.localeCompare(stringB) === 0). What other result than 0 would you consider not annoying? Some constant such that the check would be something like if (stringA.localeCompare(stringB) === ComparisonResult.orderedSame)?


{} == "[object Object]"evaluates to true, for example.String().equals()is not a method in JS...