a !== a
too good to be true?
The actual heading should be: A short story about the weird parts of
NaN is surprisingly
Number. Which is weird because it is used to define something which isn’t a number.
typeOf(NaN); // "number"
It is used for instance for a result of a bad calculation.
var a = 3 * "jalal"; // NaN
The most confusing part about
NaN is that
NaN compared to anything else is always
NaN == false; // false
NaN == true; // false
An even compared to itself equals always
NaN == NaN; // false
NaN === NaN; // false
This raises one question:
How to check if a variable is NaN?
isNaN(), but it has, unfortunately, some issues on its own.
Let’s go through some examples:
isNaN(NaN); // true
isNaN(1); // false because 1 is a number
This is also not surprising!
isNaN('1'); // false
This worked too because
isNaN coerces the passed in parameter and then checks if it is not a number.
isNaN('a'); // true because 'a' is not a number
Again, an implicit coercion is happening here.
isNaN tries to convert the parameter into a number. The result of this effort having ‘a’ as a parameter is
Number('a'); // NaN
parseInt('a'); // NaN
Number('1'); // 1
This is why
true. It’s similar to
So basically the
isNaN function is useless unless you are 100% certain that the passed in parameter is supposed to be a number.
Again, how to check if a variable is NaN?
We mentioned before that
false if it is compared to itself. We can make use of that!
var a = 3 * 'jalal'; // a = NaN
if (a !== a) console.log('A is NaN'); // a !== a equals to true
This is the only way (I am aware of) to certainly check if a variable is
You can imagine that those weird parts are important to know because they are fruitful soil for bugs of any kind.
Jalal Fathi is freelance software developer and startup founder. Passionate about web technologies and in love with Polymer. Learn more.