Javascript Operators === & !==






4.33/5 (3 votes)
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...
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)
.
x == y
, where x
and y
are values, produces true
or false
. Such a comparison is performed as follows:
- If
Type(x)
is different fromType(y)
, go to step 14. - If
Type(x)
is Undefined, returntrue
. - If
Type(x)
isNull
, returntrue
. - If
Type(x)
is notNumber
, go to step 11. - If
x
isNaN
, returnfalse
. - If
y
isNaN
, returnfalse
. - If
x
is the same number value asy
, returntrue
. - If
x
is+0
andy
is−0
, returntrue
. - If
x
is−0
andy
is+0
, returntrue
. - Return
false
. - If
Type(x)
isString
, then returntrue
ifx
andy
are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, returnfalse
. - If
Type(x)
isBoolean
, returntrue
ifx
andy
are bothtrue
or bothfalse
. Otherwise, returnfalse
. - Return
true
ifx
andy
refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, returnfalse
. - If
x
isnull
andy
is undefined, returntrue
. - If
x
is undefined andy
isnull
, returntrue
.- 5 6 - - If
Type(x)
isNumber
andType(y)
isString
, return the result of the comparisonx == ToNumber(y)
. - If
Type(x)
isString
andType(y)
isNumber
, return the result of the comparisonToNumber(x) == y
. - If
Type(x)
isBoolean
, return the result of the comparisonToNumber(x) == y
. - If
Type(y)
isBoolean
, return the result of the comparisonx == ToNumber(y)
. - If
Type(x)
is eitherString
orNumber
andType(y)
isObject
, return the result of the comparisonx == ToPrimitive(y)
. - If
Type(x)
isObject
andType(y)
is eitherString
orNumber
, return the result of the comparisonToPrimitive(x) == y
. - Return
false