The algorithm behind the EqualityExpression (==,===, !=, !==) is a bit more complex than what is portrayed in some of the other alternates and comments, and a correct understanding of this actually quite important in order to avoid unforeseen errors in javascript programs.
The short story is that the equality operators will
always compare values of identical types, and if the original operands are not equal, then an algorithm is used to coerce one of the values to the other.
If you want a good explanation of all of this, then take a look
here[
^]
Regarding the algorithm, here is the formal explanation from the
ECMAScript 262-3[
^]/5 spec:
11.9.1 The Equals Operator (
==
)
The production
EqualityExpression : EqualityExpression == RelationalExpression
is evaluated as follows:
- Evaluate
EqualityExpression
.
- Call
GetValue(Result(1))
.
- Evaluate
RelationalExpression
.
- Call
GetValue(Result(3))
.
- Perform the comparison
Result(4) == Result(2)
. (see 11.9.3).
- Return
Result(5)
.
11.9.3 The Abstract Equality Comparison Algorithm
The comparison
x == y
, where
x
and
y
are values, produces
true
or
false
. Such a comparison is performed as follows:
- If
Type(x)
is different from Type(y)
, go to step 14.
- If
Type(x)
is Undefined, return true
.
- If
Type(x)
is Null
, return true
.
- If
Type(x)
is not Number
, go to step 11.
- If
x
is NaN
, return false
.
- If
y
is NaN
, return false
.
- If
x
is the same number value as y
, return true
.
- If
x
is +0
and y
is −0
, return true
.
- If
x
is −0
and y
is +0
, return true
.
- Return
false
.
- If
Type(x)
is String
, then return true
if x
and y
are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false
.
- If
Type(x)
is Boolean
, return true
if x
and y
are both true
or both false
. Otherwise, return false
.
- Return
true
if x
and y
refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, return false
.
- If
x
is null
and y
is undefined, return true
.
- If
x
is undefined and y
is null
, return true
.- 5 6 -
- If
Type(x)
is Number
and Type(y)
is String
,
return the result of the comparison x == ToNumber(y)
.
- If
Type(x)
is String
and Type(y)
is Number
,
return the result of the comparison ToNumber(x) == y
.
- If
Type(x)
is Boolean
, return the result of the comparison ToNumber(x) == y
.
- If
Type(y)
is Boolean
, return the result of the comparison x == ToNumber(y)
.
- If
Type(x)
is either String
or Number
and Type(y)
is Object
, return the result of the comparison x == ToPrimitive(y)
.
- If
Type(x)
is Object
and Type(y)
is either String
or Number
, return the result of the comparison ToPrimitive(x) == y
.
- Return
false