Pourquoi NaN est-il un Number ? – Le moment où la logique s’effondre et JavaScript sourit 🤯

Le Guide JavaScript

Tous ceux qui apprennent JavaScript vivent tôt ou tard ce moment traumatisant.

Tu écris le code.
La logique est parfaite.
Tu ouvres la console.

typeof NaN

Et la réponse apparaît :

"number"

Et instantanément, ce dialogue se déclenche dans ta tête :

« NaN ne veut-il pas dire Not a Number ? »
« Comment ça peut être un number ? »
« JavaScript se moque de moi ? » 😐

Oui.
Mais il le fait en toute conscience 😄
Voyons maintenant pourquoi, vraiment.


Qu’est-ce que NaN ? (Mais vraiment, hein ?)

NaN signifie :

Not a Number

Mais cette expression est un peu trompeuse.

NaN ne veut pas dire :

❌ « Ceci n’est pas un nombre » (erreur)
❌ Une exception qui fait planter ton programme

NaN signifie :

✅ Le résultat d’une opération numérique échouée

Autrement dit, JavaScript te dit :

« C’était bien une opération numérique…
mais aucun nombre cohérent n’en est sorti. » 🤷‍♂️


Premier exemple : comment NaN apparaît-il ?

5 / "apple"

Voici ce que JavaScript essaie de faire :

Peut-on convertir "apple" en nombre ?

❌ Non.

Mais comme c’est une opération mathématique, le résultat devient :

NaN

En résumé :

« Ce n’est pas une erreur de string…
c’est juste que les maths ont explosé. » 💥


Encore plus de façons d’invoquer NaN (la fête continue 🎉)

0 / 0              // NaN
Math.sqrt(-1)      // NaN
parseInt("JS")     // NaN
Number("hello")    // NaN

📌 Point commun ?

Tous ces cas :

• attendent des nombres
• effectuent des opérations numériques
• échouent à produire un nombre valide


La vraie question : pourquoi typeof NaN === "number" ?

C’est le cœur du problème ❤️

Que contient le type Number en JavaScript ?

Pas seulement les « nombres normaux ».

typeof 42          // "number"
typeof 3.14        // "number"
typeof Infinity    // "number"
typeof -Infinity   // "number"
typeof NaN         // "number"

😈 Plot twist :
NaN est le membre problématique — mais jamais exclu — de la famille Number.

La logique de JavaScript est simple :

« Cette valeur provient d’une opération numérique.
Le résultat peut être absurde,
mais le type reste le même. »


Une analogie simple 🧠

Imagine ceci :

Tu passes un examen de mathématiques.
Tu fais l’exercice… mais tu te trompes.

Type d’examen : Mathématiques
Résultat : Faux

Mais l’examen reste un examen de maths.

👉 NaN = un mauvais résultat mathématique
👉 Mais toujours dans la catégorie mathématique


Encore plus étrange : NaN n’est pas égal à lui-même 🤡

Puisqu’on est déjà confus, allons plus loin :

NaN === NaN

Résultat :

false

Oui.
NaN ne se reconnaît même pas lui-même 😵‍💫

Pourquoi ?

Parce que selon la norme IEEE 754 :

NaN signifie « indéfini »

Et les choses indéfinies :

• ne peuvent pas être comparées
• ne peuvent pas être égales
• ne peuvent pas être fixées

C’est pour cela que :

NaN == NaN     // false
NaN === NaN   // false

📌 Fait en or :
NaN est la seule valeur en JavaScript qui n’est pas égale à elle-même.


« Alors COMMENT vérifier NaN ? » 😤

Ah oui… le piège classique.

❌ Mauvaise méthode

value === NaN

Ça ne fonctionnera jamais.
Jamais.
Aucune exception.


❌ Autre piège : isNaN

isNaN("hello") // true 😐

« Pourquoi c’est vrai ? » demandes-tu…

Parce que isNaN fait ceci :

1️⃣ Tente de convertir la valeur en nombre
2️⃣ Vérifie ensuite si c’est NaN

Number("hello") // NaN

C’est pourquoi isNaN("hello") === true.

⚠️ Dangereux.


✅ La bonne méthode moderne

Number.isNaN(value)

Soyons parfaitement clairs :

Number.isNaN(NaN)        // true
Number.isNaN(42)         // false
Number.isNaN("NaN")      // false
Number.isNaN("hello")   // false

🧠 Règle d’or :

Si tu vérifies NaN,
ton réflexe doit être Number.isNaN.


Mini tableau comparatif 🧾

ValeurtypeofisNaNNumber.isNaN
NaN“number”truetrue
“hello”“string”true ❌false ✅
42“number”falsefalse
“42”“string”falsefalse

Où ça fait mal dans la vraie vie ? 🔥

Par exemple, les champs de formulaire :

const age = Number(input.value);

if (Number.isNaN(age)) {
  console.log("Veuillez entrer un nombre");
}

Si tu vérifies mal NaN :

• mauvais messages utilisateur
• bugs
• frustration 😄


Bug ou fonctionnalité du langage ?

❌ Pas un bug
✅ Une décision historique
✅ La norme IEEE 754
✅ La compatibilité rétroactive

JavaScript te dit en gros :

« Je suis bizarre.
Mais intérieurement…
je suis cohérent. » 😄


Mini coin astuces 💡

🔹 NaN n’est pas une erreur
🔹 typeof ne dit pas toujours toute la vérité
🔹 Les vérifications NaN sont critiques
🔹 Attention particulière aux formulaires, API et parsings


Résumé court mais percutant 👊

• NaN signifie Not a Number
• Mais son type est number
• Parce qu’il résulte d’une opération numérique
• Il n’est pas égal à lui-même
• Toujours le vérifier avec Number.isNaN()
• C’est l’un des tests de logique les plus iconiques de JavaScript

Et si un jour tu te dis :

« Mais pourquoi ce langage est comme ça… »

La réponse est simple 😄
JavaScript te teste.
Si tu es patient — il te récompense. 😎

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir