In almost every programming language the easiest way for comparison is "==". But in javascript there is "===" also available. If you ask anyone what is the difference between == and === is, they will say the same thing, that is === also does the type checking. Well this is absolutely correct, but still the doubt is, how does it work?
Here are few examples -
0 == false -- > true
0 === false -- > false
1 == true --> true
1 === true --> false
2 == true --> false
In order to understand the behavior of == and ===, we need to know few internal methods of javascripts.
ToPrimitive -
Return a default value for the Object. The default value of an object is retrieved by calling the [[DefaultValue]] internal method of the object.
[[DefaultValue]] - get the output of "toString" or "valueOf" method on the object. If both method not available, then throw exception.
ToNumber -
Here are few examples -
0 == false -- > true
0 === false -- > false
1 == true --> true
1 === true --> false
2 == true --> false
In order to understand the behavior of == and ===, we need to know few internal methods of javascripts.
ToPrimitive -
Return a default value for the Object. The default value of an object is retrieved by calling the [[DefaultValue]] internal method of the object.
[[DefaultValue]] - get the output of "toString" or "valueOf" method on the object. If both method not available, then throw exception.
ToNumber -
Argument Type | Result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | true - > 1, false - 0 |
Number | No change |
String | if it is number as string, then return the number, else NaN |
Object | Apply ToPrimitive, then apply ToNumber and get the output |
Lets try to understand == first.
Example -> x== y
If the typeOf x and y are same, then there is no confusion, because its normal comparison, but the trick comes when the types are different.
Key Concept - Javascript internally converts x and y both into Numbers, if the Types are different and then do the comparison.
Lets try to practice it by example -
Variable Type | ToNumber | Example |
---|---|---|
String |
Numeric number in string -> corresponding number
Nan, for everything else
|
'5' == 5 -> true
'a' == 2 -> false
|
Object | Apply toprimitive first, and then use above mentioned conversions for comparison |
new String('1') == 1 -> true
new Boolean(false) == 0 -> true
|
Number | No change |
1==2 -> false
3==3 -> true
|
Boolean |
true - > 1
false -> 0
|
true == 1 -> true ; false == 0 -> true
true == 3 -> false ; false == 1 -> false
|
In case of x and y being null or undefined, they are compared with following rules -
null == undefined -> true
In case of ===, the very first check javascript does is, to check the types of both x and y. Both are of different types then return false, else go ahead with further comparison.