NaN Neden number? – Mantığın Çöktüğü, JavaScript’in Sırıttığı An 🤯

NaN Neden number? – Mantığın Çöktüğü, JavaScript’in Sırıttığı An 🤯

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.isNaN olsun.


Mini Karşılaştırma Tablosu 🧾

DeğertypeofisNaNNumber.isNaN
NaN“number”truetrue
"hello"“string”true ❌false ✅
42“number”falsefalse
"42"“string”falsefalse

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

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