window.isNaN()
The global function isNaN()
can be used to check if a certain value or expression evaluates to NaN
. This function (in short) first checks if the value is a number, if not tries to convert it (*), and then checks if the resulting value is NaN
. For this reason, this testing method may cause confusion.
(*) The "conversion" method is not that simple, see ECMA-262 18.2.3 for a detailed explanation of the algorithm.
These examples will help you better understand the isNaN()
behavior:
isNaN(NaN); // true
isNaN(1); // false: 1 is a number
isNaN(-2e-4); // false: -2e-4 is a number (-0.0002) in scientific notation
isNaN(Infinity); // false: Infinity is a number
isNaN(true); // false: converted to 1, which is a number
isNaN(false); // false: converted to 0, which is a number
isNaN(null); // false: converted to 0, which is a number
isNaN(""); // false: converted to 0, which is a number
isNaN(" "); // false: converted to 0, which is a number
isNaN("45.3"); // false: string representing a number, converted to 45.3
isNaN("1.2e3"); // false: string representing a number, converted to 1.2e3
isNaN("Infinity"); // false: string representing a number, converted to Infinity
isNaN(new Date); // false: Date object, converted to milliseconds since epoch
isNaN("10$"); // true : conversion fails, the dollar sign is not a digit
isNaN("hello"); // true : conversion fails, no digits at all
isNaN(undefined); // true : converted to NaN
isNaN(); // true : converted to NaN (implicitly undefined)
isNaN(function(){}); // true : conversion fails
isNaN({}); // true : conversion fails
isNaN([1, 2]); // true : converted to "1, 2", which can't be converted to a number
This last one is a bit tricky: checking if an Array
is NaN
. To do this, the Number()
constructor first converts the array to a string, then to a number; this is the reason why isNaN([])
and isNaN([34])
both return false
, but isNaN([1, 2])
and isNaN([true])
both return true
: because they get converted to ""
, "34"
, "1,2"
and "true"
respectively. In general, an array is considered NaN
by isNaN()
unless it only holds one element whose string representation can be converted to a valid number.
Number.isNaN()
In ECMAScript 6, the Number.isNaN()
function has been implemented primarily to avoid the problem of window.isNaN()
of forcefully converting the parameter to a number. Number.isNaN()
, indeed, doesn't try to convert the value to a number before testing. This also means that only values of the type number, that are also NaN
, return true
(which basically means only Number.isNaN(NaN)
).
From ECMA-262 20.1.2.4:
When the
Number.isNaN
is called with one argumentnumber
, the following steps are taken:
- If Type(number) is not Number, return
false
.- If number is
NaN
, returntrue
.- Otherwise, return
false
.
Some examples:
// The one and only
Number.isNaN(NaN); // true
// Numbers
Number.isNaN(1); // false
Number.isNaN(-2e-4); // false
Number.isNaN(Infinity); // false
// Values not of type number
Number.isNaN(true); // false
Number.isNaN(false); // false
Number.isNaN(null); // false
Number.isNaN(""); // false
Number.isNaN(" "); // false
Number.isNaN("45.3"); // false
Number.isNaN("1.2e3"); // false
Number.isNaN("Infinity"); // false
Number.isNaN(new Date); // false
Number.isNaN("10$"); // false
Number.isNaN("hello"); // false
Number.isNaN(undefined); // false
Number.isNaN(); // false
Number.isNaN(function(){}); // false
Number.isNaN({}); // false
Number.isNaN([]); // false
Number.isNaN([1]); // false
Number.isNaN([1, 2]); // false
Number.isNaN([true]); // false