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

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

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. 😎

Comments

No comments yet. Why don’t you start the discussion?

Bir yanıt yazın

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