JavaScript öğrenirken herkesin yaşadığı o travmatik an vardır.
Kodu yazarsın.
Mantık çalışır.
Konsolu açarsın.
typeof NaN
Ve cevap gelir:
"number"
O an beyninde şu diyalog döner:
“NaN = Not a Number değil miydi?”
“Bu nasıl number?”
“JavaScript bana mı oynuyor?” 😐
Evet.
Ama bilinçli oynuyor 😄
Şimdi nedenini gerçekten anlayalım.
NaN Nedir? (Ama Gerçekten Nedir?)
NaN, açılımıyla:
Not a Number
Ama bu cümle biraz yanıltıcı.
NaN demek:
- ❌ “Bu sayı değil” hatası değil
- ❌ Programı durduran bir exception değil
- ✅ Sayısal bir işlemin başarısız sonucu
Yani JavaScript şunu diyor:
“Bu bir number işlemi…
ama ortaya mantıklı bir sayı çıkmadı.” 🤷♂️
İlk Örnek: NaN Nasıl Ortaya Çıkar?
5 / "elma"
JavaScript burada şunu dener:
"elma"→ number’a çevrilebilir mi?- ❌ Hayır
Ama bu bir matematik işlemi olduğu için sonuç:
NaN
Yani:
“Bu bir string hatası değil,
bu matematik çöktü.” 💥
Daha Fazla NaN Üreten Örnek (Şenlik Var 🎉)
0 / 0 // NaN
Math.sqrt(-1) // NaN
parseInt("JS") // NaN
Number("hello") // NaN
📌 Ortak nokta ne?
Hepsi:
- number bekleyen
- ama number üretmeyen
- sayısal işlemler
Asıl Soru: Neden typeof NaN === "number"?
İşte olayın kalbi ❤️
JavaScript’te Number tipi neyi kapsar?
Sadece “normal sayılar” değil.
typeof 42 // "number"
typeof 3.14 // "number"
typeof Infinity // "number"
typeof -Infinity // "number"
typeof NaN // "number"
😈 Plot twist:NaN, Number ailesinin problemli ama kovulmayan üyesi.
JavaScript’in bakış açısı şu:
“Bu değer, bir number işleminin sonucudur.
Sonuç saçma olabilir ama türü değişmez.”
Basit Benzetme 🧠
Bunu şöyle düşün:
Bir matematik sınavındasın.
Soruyu çözüyorsun ama yanlış yapıyorsun.
- Sınav türü: Matematik
- Sonuç: Yanlış
Ama sınav hâlâ matematik.
👉 NaN = yanlış matematik sonucu
👉 Ama hâlâ matematik kategorisinde
Daha da Garibi: NaN Kendine Eşit Değil 🤡
Hazır şaşırmışken devam edelim:
NaN === NaN
Sonuç:
false
Evet.
NaN kendini bile tanımıyor 😵💫
Neden?
Çünkü IEEE 754 standardına göre:
NaN = “Tanımsız”
Tanımsız şeyler:
- karşılaştırılamaz
- eşitlenemez
- sabitlenemez
Bu yüzden:
NaN == NaN // false
NaN === NaN // false
📌 Altın bilgi:
JavaScript’te kendine eşit olmayan tek değer NaN’dır.
“E O ZAMAN NaN Nasıl Kontrol Edilecek?” 😤
İşte herkesin düştüğü tuzak burada.
❌ Yanlış Yöntem
value === NaN
Bu ASLA çalışmaz.
Ne verirsen ver, false.
❌ Bir Diğer Tuzak: isNaN
isNaN("hello") // true 😐
“Neden true?” diyorsan…
Çünkü isNaN:
1️⃣ Önce değeri number’a çevirmeye çalışır
2️⃣ Sonra NaN mi diye bakar
Number("hello") // NaN
O yüzden isNaN("hello") === true
Bu da tehlikeli.
✅ Doğru ve Modern Yol
Number.isNaN(value)
Örneklerle netleştirelim:
Number.isNaN(NaN) // true
Number.isNaN(42) // false
Number.isNaN("NaN") // false
Number.isNaN("hello") // false
🧠 Kural:
NaN kontrolü yapıyorsan, refleksin
Number.isNaNolsun.
Mini Karşılaştırma Tablosu 🧾
| Değer | typeof | isNaN | Number.isNaN |
|---|---|---|---|
NaN | “number” | true | true |
"hello" | “string” | true ❌ | false ✅ |
42 | “number” | false | false |
"42" | “string” | false | false |
Gerçek Hayatta Nerede Can Yakar? 🔥
Formlardan gelen input’lar
const age = Number(input.value);
if (Number.isNaN(age)) {
console.log("Lütfen sayı giriniz");
}
Yanlış kontrol edersen:
- kullanıcıya yanlış mesaj
- bug
- sinir 😄
Bu Bir Bug mı? Yoksa Dilin Karakteri mi?
❌ Bug değil
✅ Tarihsel karar
✅ IEEE 754 standardı
✅ Geriye dönük uyumluluk
JavaScript şunu diyor:
“Ben garibim.
Ama tutarlıyım…
kendi içimde.” 😄
Mini İpuçları Köşesi 💡
🔹 NaN bir hata değildir
🔹 typeof her zaman doğruyu söylemez
🔹 NaN kontrolleri kritiktir
🔹 Form, API, parse işlemlerinde ekstra dikkat
Kısa Ama Tokat Gibi Özet 👊
NaN= Not a Number- Ama türü number
- Çünkü number işleminin sonucu
- Kendine eşit değildir
Number.isNaN()ile kontrol edilir- JavaScript’in en ikonik “mantık testlerinden” biridir

