Let’s start with code
var a = -1; if(a) console.log("Anything but JS"); else console.log("Even assembly will do!");
Output Anything but JS
Reason behind this output is that any NUMBER except 0 is converted to true. Implicit type conversion happened and -1 is converted to true.
Well let’s see the sloppy side of it by another example-
var a = -1; if(a == true) console.log("There are 2 type of people in this world."); else console.log("1 who hate JS. And 1 who don’t know it!");
Output: “1 who hate JS. And 1 who don’t know it!”
For understating this, we need to understand that in case of = = (Double equals), implicit type conversion happens when data type of operands are not same. And the variable which will get converted is decided on the basics of ECMA specification algorithm for at- Abstract Equality Comparison Algorithm.
And according to this, in case of number and Boolean comparison, Boolean variable is the one which will get converted.
And irony is that true is always converted to 1, and false is always converted to 0.
So this code will work as expected-
var a = 1; if(a == true) console.log("This happens when even standards are sloppy."); else console.log("Now we know the output");
Output: This happens when even standards are sloppy.
The message to take away from here is to keep that algorithm in mind while comparing two different data type values or use explicit conversion.