Everyone who learns JavaScript eventually experiences that traumatic moment.
You write the code.
The logic makes sense.
You open the console.
typeof NaN
And the answer appears:
"number"
And instantly, this dialogue starts playing in your head:
“Isn’t NaN Not a Number?”
“How is this a number?”
“Is JavaScript messing with me?” 😐
Yes.
But it’s doing it on purpose 😄
Let’s actually understand why.
What Is NaN? (But Like… Really?)
NaN stands for:
Not a Number
But that phrase is a bit misleading.
NaN does not mean:
❌ “This is not a number” error
❌ An exception that crashes your program
It does mean:
✅ The result of a failed numeric operation
In other words, JavaScript is saying:
“This was a number operation…
but no meaningful number came out of it.” 🤷♂️
First Example: How Does NaN Appear?
5 / "apple"
Here’s what JavaScript tries to do:
Can "apple" be converted into a number?
❌ No.
But since this is a mathematical operation, the result becomes:
NaN
So basically:
“This isn’t a string error…
math just collapsed.” 💥
More Ways to Summon NaN (The Party Continues 🎉)
0 / 0 // NaN
Math.sqrt(-1) // NaN
parseInt("JS") // NaN
Number("hello") // NaN
📌 What do all of these have in common?
They all are:
• expecting numbers
• performing numeric operations
• failing to produce a valid number
The Real Question: Why Is typeof NaN === "number"?
This is the heart of the issue ❤️
What does the Number type include in JavaScript?
Not just “normal” numbers.
typeof 42 // "number"
typeof 3.14 // "number"
typeof Infinity // "number"
typeof -Infinity // "number"
typeof NaN // "number"
😈 Plot twist:
NaN is the problematic—but never kicked out—member of the Number family.
JavaScript’s logic is simple:
“This value came from a numeric operation.
The result may be nonsense,
but the type stays the same.”
A Simple Analogy 🧠
Think of it like this:
You’re taking a math exam.
You solve the problem — but you solve it wrong.
Exam type: Math
Result: Wrong
But the exam is still math.
👉 NaN = a wrong math result
👉 Still belongs to the math category
It Gets Weirder: NaN Is Not Equal to Itself 🤡
Since we’re already confused, let’s go further:
NaN === NaN
Result:
false
Yes.
NaN doesn’t even recognize itself 😵💫
Why?
Because according to the IEEE 754 standard:
NaN means “undefined”
And undefined things:
• can’t be compared
• can’t be equal
• can’t be pinned down
That’s why:
NaN == NaN // false
NaN === NaN // false
📌 Golden fact:
NaN is the only value in JavaScript that is not equal to itself.
“Then HOW Do We Check for NaN?” 😤
Ah yes — the classic trap.
❌ Wrong Way
value === NaN
This will never work.
Ever.
No exceptions.
❌ Another Trap: isNaN
isNaN("hello") // true 😐
“Why is this true?” you ask…
Because isNaN does this:
1️⃣ Tries to convert the value to a number
2️⃣ Then checks if it’s NaN
Number("hello") // NaN
That’s why isNaN("hello") === true.
⚠️ Dangerous.
✅ The Correct and Modern Way
Number.isNaN(value)
Let’s make it crystal clear:
Number.isNaN(NaN) // true
Number.isNaN(42) // false
Number.isNaN("NaN") // false
Number.isNaN("hello") // false
🧠 Rule of thumb:
If you’re checking for NaN,
your reflex should be Number.isNaN.
Mini Comparison Table 🧾
| Value | typeof | isNaN | Number.isNaN |
|---|---|---|---|
| NaN | “number” | true | true |
| “hello” | “string” | true ❌ | false ✅ |
| 42 | “number” | false | false |
| “42” | “string” | false | false |
Where Does This Hurt in Real Life? 🔥
Form inputs, for example:
const age = Number(input.value);
if (Number.isNaN(age)) {
console.log("Please enter a number");
}
If you check NaN incorrectly:
• wrong user messages
• bugs
• frustration 😄
Is This a Bug or a Language Feature?
❌ Not a bug
✅ A historical decision
✅ IEEE 754 standard
✅ Backward compatibility
JavaScript is basically saying:
“I’m weird.
But internally…
I’m consistent.” 😄
Mini Tips Corner 💡
🔹 NaN is not an error
🔹 typeof doesn’t always tell the whole truth
🔹 NaN checks are critical
🔹 Be extra careful with forms, APIs, and parsing
Short but Slap-in-the-Face Summary 👊
• NaN means Not a Number
• But its type is number
• Because it’s the result of a numeric operation
• It’s not equal to itself
• Always check it with Number.isNaN()
• It’s one of JavaScript’s most iconic “logic tests”
And if one day you think:
“Why is this language like this…”
The answer is simple 😄
JavaScript is testing you.
If you’re patient — it rewards you. 😎
