Because you are comparing the (boolean) result of the first equality with the (non-boolean) third value.
In code, 1 == 1 == 1
is equivalent to (1 == 1) == 1
is equivalent to true == 1
.
This means the three methods can be written more simply as:
function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }
These comparisons work according to these rules (emphasis mine):
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 string operand is
converted to a number if possible. If both operands are objects, then
JavaScript compares internal references which are equal when operands
refer to the same object in memory.
So what happens in c
is that "a"
is converted to a number (giving NaN
) and the result is strictly compared to true
converted to a number (giving 1
).
Since 1 === NaN
is false
, the third function returns false
. It's very easy to see why the first two functions will return true
.