Reputation: 1707
MDC describes the ==
operator as follows:
If the two operands are not of the same type, JavaScript converts the operands then applies strict comparison. If either operand is a number or a boolean, the operands are converted to numbers if possible; else if either operand is a string, the other operand is converted to a string if possible.
With this in mind, I would evaluate "true" == true
as follows:
isNaN(Number("true")) // true
)String(true) === "true" // true
)I've ended up with the strings "true"
and "true"
, which should evaluate to true
, but JavaScript shows false.
What have I missed?
Upvotes: 103
Views: 46011
Reputation: 115
The equality operators (==
and !=
) use the Abstract Equality Comparison Algorithm to compare two operands.
"true" == true
Since "true"
is String
and true
is Boolean
, we need to return the result of "true" == Number(true)
(step 7
in the algorithm), which is "true" == 1
.
"true" == 1
Since "true"
is String
and 1
is Number
, we need to return the result of Number("true") == 1
(step 5
in the algorithm). Number("true")
returns NaN
.
Now we have NaN == 1
.
NaN == 1
Now both operands are of the same type (Number
).
Acording to the algorithm, if both operands are Number
and one of them is NaN
, false
is returned (step 1.c.i
in the algorithm).
Upvotes: 2
Reputation: 471
Explaining considering the scenario true == "true".
Straightway, the above returns false, however, our expectation was true
JavaScript uses Abstract Equality Comparison Algorithm, so according to the algorithm
true == "true"
// If one of the operands is Boolean, convert the Boolean operand to 1 if it is true and +0 if it is false
ConvertToNumber(true) == "true"
1 == "true"
// When the algorithm finds the above statements, it thinks that it needs to do one more conversion -
// "When comparing a number to a string, try to convert the string to a numeric value"
1 == ConvertToNumber("true)
1 == NaN
// Which returns false
Upvotes: 0
Reputation: 327
The ==
comparison operator is defined in ECMA 5 as:
So, "true" == true is evaluated as:
===> false
Upvotes: 22
Reputation: 22885
Acording to The Abstract Equality Comparison Algorithm
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
if one of the oprends is a boolean and other is not, boolean is converter to number 0 or 1. so true == "true"
is false.
Upvotes: 4
Reputation: 22617
Because "true"
is converted to NaN
, while true
is converted to 1
. So they differ.
Like you reported, both are converted to numbers, because at least true
can be (see Erik Reppen's comment), and then compared.
Upvotes: 102