NaN
("Not a Number") is a special value defined by the IEEE Standard for Floating-Point Arithmetic, which is used when a non-numeric value is provided but a number is expected (1 * "two"
), or when a calculation doesn't have a valid number
result (Math.sqrt(-1)
).
Any equality or relational comparisons with NaN
returns false
, even comparing it with itself. Because, NaN
is supposed to denote the result of a nonsensical computation, and as such, it isn’t equal to the result of any other nonsensical computations.
(1 * "two") === NaN //false
NaN === 0; // false
NaN === NaN; // false
Number.NaN === NaN; // false
NaN < 0; // false
NaN > 0; // false
NaN > 0; // false
NaN >= NaN; // false
NaN >= 'two'; // false
Non-equal comparisons will always return true
:
NaN !== 0; // true
NaN !== NaN; // true
You can test a value or expression for NaN
by using the function Number.isNaN():
Number.isNaN(NaN); // true
Number.isNaN(0 / 0); // true
Number.isNaN('str' - 12); // true
Number.isNaN(24); // false
Number.isNaN('24'); // false
Number.isNaN(1 / 0); // false
Number.isNaN(Infinity); // false
Number.isNaN('str'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
You can check if a value is NaN
by comparing it with itself:
value !== value; // true for NaN, false for any other value
You can use the following polyfill for Number.isNaN()
:
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
By contrast, the global function isNaN()
returns true
not only for NaN
, but also for any value or expression that cannot be coerced into a number:
isNaN(NaN); // true
isNaN(0 / 0); // true
isNaN('str' - 12); // true
isNaN(24); // false
isNaN('24'); // false
isNaN(Infinity); // false
isNaN('str'); // true
isNaN(undefined); // true
isNaN({}); // true
ECMAScript defines a “sameness” algorithm called SameValue
which, since ECMAScript 6, can be invoked with Object.is
. Unlike the ==
and ===
comparison, using Object.is()
will treat NaN
as identical with itself (and -0
as not identical with +0
):
Object.is(NaN, NaN) // true
Object.is(+0, 0) // false
NaN === NaN // false
+0 === 0 // true
You can use the following polyfill for Object.is()
(from MDN):
if (!Object.is) {
Object.is = function(x, y) {
// SameValue algorithm
if (x === y) { // Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
};
}
NaN itself is a number, meaning that it does not equal to the string "NaN", and most importantly (though perhaps unintuitively):
typeof(NaN) === "number"; //true