JavaScript NaN – advanced JS interview question

RMAG news

In JavaScript, NaN means “not a number.” If you run

typeof NaN // number

you will get “number” because NaN is used to define a number that really isn’t a number.

Many times when we code we need to be sure that the data type we are working with is actually a number. JS has a built in method called isNaN that will accept any input and let you know if it’s not a number. Let’s take a look at a few examples:

isNaN(1) // false 1 is not not a number

isNaN(“A”) // true “A” is not number

isNaN(“1”) // false “1” is not not a number ….. wait what?

The string “1” is a number? That’s what JS is telling us. But anything in quotation marks is for sure Not a Number because anything in quotation marks is a string. If you run typeof “1” you will get string. The thing to understand here is that isNaN is doing implicit coercion “behind the scenes.” It is first calling Number(“1”), which turns “1” into 1, and then running isNaN(1).

isNaN(Number(“1”)) // false because it is a number now that it’s been coerced.

Great, so basically isNaN isn’t going to be very useful unless we are 100% sure of the input type, but in a dynamically typed language, how can you ever really be sure? That’s exactly why we need a foolproof way to check. Is there a way to guarantee that some input is truly not a number? Yes, and we can really impress our interviewers by showing them our deep understanding of JS.

Firstly, in JS, anything compared to itself is true.

a = 1;
a === a; //true
b = “B”;
b === b; // true

and NaN compared to anything else will be false.

NaN === 1 // false
NaN === false // false
NaN === “b” // false

Ok. So far so good. This makes perfect sense. So NaN compared to itself is going to be true then, right? Nope.

NaN === NaN //false

What? Ok, that’s weird, but could we use this to our advantage to ensure something is a number? If we know that only in this one situation of something being NaN will the comparison to itself fail, we can simple compare any variable in question to itself with the !== operator and if we get “true” we know that our input is NaN.

a = 1
a !== a // false because 1 === 1

a = NaN
a !== a // true

If ‘a’ is anything other than NaN, the !== will always be false. But due to the strange truth that NaN === NaN is false, a !== a will be true.

Your deep knowledge of the inner workings of JS will surely impress! Now go use Number.isNaN(). It’s far more readable and understandable.

Please follow and like us:
Pin Share