Reliably testing for NaN has become much simpler (and safer) in ES6 using Number.isNaN( x ):
a = "foo" * 2;
b = "bar";
Number.isNaN( a ); // true
Number.isNaN( b ); // false
How is this different than the current isNaN( x )?
We are trying to test for, and find the value NaN. isNaN( x ) doesn’t check if the value is NaN; It checks to see if the value is literally not a number:
a = "foo" * 2;
b = "bar";
isNaN( a ); // true
isNaN( b ); // true
While it is true that b is not a number (string), we want to check to see if b is the value NaN not check if it was literally a number. If you are using isNaN( x ) to test against NaN, you are explicitly creating a bug in your application and need to avoid it.
Polyfill pre-ES6
A very simple way to write this polyfill is by understanding that NaN is a very special kind of value in JavaScript, in which NaN is never equal to itself:
NaN !== NaN // true
While this is rather odd, this helps us write the simplest polyfill ever:
if (!Number.isNaN) {
Number.isNaN = function(n) {
return n !== n;
};
}