isNaN()
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
TheisNaN()
function determines whether a value isNaN
, first converting the value to a number if necessary. Because coercion inside theisNaN()
function can besurprising, you may prefer to useNumber.isNaN()
.
Try it
function milliseconds(x) { if (isNaN(x)) { return "Not a Number!"; } return x * 1000;}console.log(milliseconds("100F"));// Expected output: "Not a Number!"console.log(milliseconds("0.0314E+2"));// Expected output: 3140
Syntax
isNaN(value)
Parameters
value
The value to be tested.
Return value
true
if the given value isNaN
after beingconverted to a number; otherwise,false
.
Description
isNaN()
is a function property of the global object.
For number values,isNaN()
tests if the number is the valueNaN
. When the argument to theisNaN()
function is not of typeNumber, the value is first coerced to a number, and the resulting value is then compared againstNaN
.
This behavior ofisNaN()
for non-numeric arguments can be confusing! For example, an empty string is coerced to 0, while a boolean is coerced to 0 or 1; both values are intuitively "not numbers", but they don't evaluate toNaN
, soisNaN()
returnsfalse
. Therefore,isNaN()
answers neither the question "is the input the floating pointNaN
value" nor the question "is the input not a number".
Number.isNaN()
is a more reliable way to test whether a value is the number valueNaN
or not. Alternatively, the expressionx !== x
can be used, and neither of the solutions is subject to the false positives that make the globalisNaN()
unreliable. To test if a value is a number, usetypeof x === "number"
.
TheisNaN()
function answers the question "is the input functionally equivalent toNaN
when used in a number context". IfisNaN(x)
returnsfalse
, you can usex
in an arithmetic expression as if it's a valid number that's notNaN
. IfisNaN(x)
returnstrue
,x
will get coerced toNaN
and make most arithmetic expressions returnNaN
(becauseNaN
propagates). You can use this, for example, to test whether an argument to a function is arithmetically processable (usable "like" a number), and handle values that are not number-like by throwing an error, providing a default value, etc. This way, you can have a function that makes use of the full versatility JavaScript provides by implicitly converting values depending on context.
Note:The+
operator performs both number addition and string concatenation. Therefore, even ifisNaN()
returnsfalse
for both operands, the+
operator may still return a string, because it's not used as an arithmetic operator. For example,isNaN("1")
returnsfalse
, but"1" + 1
returns"11"
. To be sure that you are working with numbers,coerce the value to a number and useNumber.isNaN()
to test the result.
Examples
Note howisNaN()
returnstrue
for values that are not the valueNaN
but are not numbers either:
isNaN(NaN); // trueisNaN(undefined); // trueisNaN({}); // trueisNaN(true); // falseisNaN(null); // falseisNaN(37); // false// StringsisNaN("37"); // false: "37" is converted to the number 37 which is not NaNisNaN("37.37"); // false: "37.37" is converted to the number 37.37 which is not NaNisNaN("37,5"); // trueisNaN("123ABC"); // true: Number("123ABC") is NaNisNaN(""); // false: the empty string is converted to 0 which is not NaNisNaN(" "); // false: a string with spaces is converted to 0 which is not NaN// DatesisNaN(new Date()); // false; Date objects can be converted to a number (timestamp)isNaN(new Date().toString()); // true; the string representation of a Date object cannot be parsed as a number// ArraysisNaN([]); // false; the primitive representation is "", which coverts to the number 0isNaN([1]); // false; the primitive representation is "1"isNaN([1, 2]); // true; the primitive representation is "1,2", which cannot be parsed as number
Specifications
Specification |
---|
ECMAScript® 2026 Language Specification # sec-isnan-number |