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 🧾
| Valeur | typeof | isNaN | Number.isNaN |
|---|---|---|---|
| NaN | “number” | true | true |
| “hello” | “string” | true ❌ | false ✅ |
| 42 | “number” | false | false |
| “42” | “string” | false | false |
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. 😎
