Testing for NaN in ES6

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;
  };
}