Why in my screenshot below isNaN(1)
and isNaN("1")
returns false
? As one of them is number and one of them is a string so isNaN("1") should return true.

- 30,465
- 43
- 141
- 221
-
2Did you do any research on this? A simple reference to MDN can usually help – Ian Feb 27 '14 at 18:32
-
or stackoverflow... http://stackoverflow.com/questions/21177042 http://stackoverflow.com/search?q=isnan+javascript – Andre Figueiredo Feb 27 '14 at 18:42
2 Answers
From MDN:
When the argument to the
isNaN
function is not of type Number, the value is first coerced to a Number. The resulting value is then tested to determine whether it is NaN. Thus for non-numbers that when coerced to numeric type result in a valid non-NaN numeric value (notably the empty string and boolean primitives, which when coerced give numeric values zero or one), the "false" returned value may be unexpected; the empty string, for example, is surely "not a number."
The article also suggests using the (experiemental) Number.isNaN
function if you don't want this behavior:
console.log(Number.isNaN("1")) // false
console.log(Number.isNaN(NaN)) // true
Or more simply:
console.log("1" != "1") // false
console.log(NaN != NaN) // true
But if what you really want to simply determine if a value of type Number
(and not for example, of type String
), simply use typeof
:
console.log(typeof "1" == "number") // false
console.log(typeof 1 == "number") // true
But this will return true
for NaN
because despite being known as 'not a number', it's actually a value of type Number
. If you want to ensure that the value is of type Number
, and a valid, finite number use the (experimental) Number.isFinite
:
console.log(Number.isFinite("1")) // false
console.log(Number.isFinite(1)) // true
console.log(Number.isFinite(NaN)) // false
Or simply create your own:
function myIsFinite(x) { return typeof x == "number" && isFinite(x); }
console.log(myIsFinite("1")) // false
console.log(myIsFinite(1)) // true
console.log(myIsFinite(NaN)) // false

- 146,324
- 30
- 291
- 331
The isNaN
function will convert the input to a number first and then determine if the resulting number is NaN.

- 733,204
- 149
- 1,241
- 1,454