Fun With Wacky JavaScript Type Comparison

I recently had a conversation with Scoot Koon (LazyCoder) over Twitter about the wacky JavaScript type comparisons that are allowed.  I was interested to see what weird oddities would come out if I compared the whole type system against it self.  So I sat down and wrote a simple JavaScript routine to do just that, and the below reference table is the output of that routine.

null undefined true false -1 0 1 NaN Infinity "" " " "null" "undefined" "true" "false" "-1" "0" "1" "NaN" "Infinity"
null null null -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
undefined undefined undefined -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
true -- -- true -- -- -- true -- -- -- -- -- -- -- -- -- -- true -- --
false -- -- -- false -- false -- -- -- false false -- -- -- -- -- false -- -- --
-1 -- -- -- -- -1 -- -- -- -- -- -- -- -- -- -- -1 -- -- -- --
0 -- -- -- 0 -- 0 -- -- -- 0 0 -- -- -- -- -- 0 -- -- --
1 -- -- 1 -- -- -- 1 -- -- -- -- -- -- -- -- -- -- 1 -- --
NaN -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Infinity -- -- -- -- -- -- -- -- Infinity -- -- -- -- -- -- -- -- -- -- Infinity
"" -- -- -- "" -- "" -- -- -- "" -- -- -- -- -- -- -- -- -- --
" " -- -- -- " " -- " " -- -- -- -- " " -- -- -- -- -- -- -- -- --
"null" -- -- -- -- -- -- -- -- -- -- -- "null" -- -- -- -- -- -- -- --
"undefined" -- -- -- -- -- -- -- -- -- -- -- -- "undefined" -- -- -- -- -- -- --
"true" -- -- -- -- -- -- -- -- -- -- -- -- -- "true" -- -- -- -- -- --
"false" -- -- -- -- -- -- -- -- -- -- -- -- -- -- "false" -- -- -- -- --
"-1" -- -- -- -- "-1" -- -- -- -- -- -- -- -- -- -- "-1" -- -- -- --
"0" -- -- -- "0" -- "0" -- -- -- -- -- -- -- -- -- -- "0" -- -- --
"1" -- -- "1" -- -- -- "1" -- -- -- -- -- -- -- -- -- -- "1" -- --
"NaN" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "NaN" --
"Infinity" -- -- -- -- -- -- -- -- "Infinity" -- -- -- -- -- -- -- -- -- -- "Infinity"

So some of the oddities that emerged to me are:

  • The word "Infinity" is equal to the type Infinity, however "true" or "false" don't equal true or false respectively.
  • " " == 0 == false and also "" == 0 == false, however " " != ""
  • Update Just noticed that NaN != NaN but Infinity == Infinity

If you would like to try this your self, or want to add to it, here is the code that I used.

  
var values = [null, undefined, true, false, -1, 0, 1, NaN, Infinity, "", " ", "null", "undefined", "true", "false", "-1", "0", "1", "NaN", "Infinity"];

document.write("<table><thead><tr><th></th>")  
for (var x = 0; x < values.length; x++) {  
    document.write("<th>" + (x > 8 ? """ : "") + values[x] + (x > 8 ? """ : "") + "</th>");
}
document.write("</tr></thead><tbody>");  
for (var i = 0; i < values.length; i++) {  
    document.write("<tr>");
    document.write("<th>" + (i > 8 ? """ : "") + values[i] + (i > 8 ? """ : "") + "</th>");

    for (var j = 0; j < values.length; j++) {
        var output = values[i] == values[j];

        document.write("<td style="text-align:center;" + (i == j ? "background-color:black;" : (output ? "background-color:green;color:#00AF33;" : "color:#e0e0e0;")) + "">");
        document.write(output ? (i > 8 ? """ : "") + values[i] + (i > 8 ? """ : "") : "--");
        document.write("</td>");
    }

    document.write("</tr>");
}
document.write("</tbody></table>");  

I think Scott really hit the nail on the head when he said this about JavaScript coercion.

LazyCoder (Scott Koon) on JavaScript Coercion

Nick Berardi

In charge of Cloud Drive Desktop at @Amazon, Entrepreneur, Microsoft MVP, ASPInsider, co-founder and CTO of @CaddioApp, Father, and @SeriouslyOpen host