Katmanya · Bestiyer

İki Hayalet

undefined · null

İki çarşaf hayalet, kardeş. Yarı saydam Gelmeyen Hayalet kapının eşiğinde “daha gelmedi” diye bekler. Daha opak Sandalye Hayaleti yanında boş bir sandalye taşır ve onu bilerek bir yere koyar.

İki anlatım

Başlangıç

Bilgisayarda bir yer var ama içi boş. Bunun iki sebebi olabilir.

Ya oraya hiç kimse bir şey koymadı; o yerde Gelmeyen Hayalet bekler. Ya da biri “burası şimdilik boş” demek için bilerek boş bir sandalye bıraktı; o yerde Sandalye Hayaleti oturur.

İkisi de “boş” demektir, ama birinde unutulmuşluk, ötekinde bir karar vardır. Hayaletler korkutmaz; boşluğun da bir adı olsun diye vardırlar.

İleri

Gelmeyen Hayalet undefined’dır: değer hiç verilmedi. Sandalye Hayaleti null’dır: “burada değer yok” bilerek yazıldı.

Ne yapar

  • Gelmeyen Hayalet şuralarda kendiliğinden belirir: değeri verilmemiş değişken, olmayan çekmece, olmayan vagon, verilmeyen argüman, return demeyen solucanın sonucu.
  • Sandalye Hayaleti biri onu bilerek çağırınca gelir. Bu bazen sensin (x = null), bazen tarayıcı: document.getElementById aradığı odayı bulamayınca null verir.
  • İkisi de kapıda (if) hayır sayılır.
  • İkisi de ?? kapısında “yok” sayılır, yerine varsayılan değer geçer.

Ne yapamaz

  • Çekmeceleri yoktur: null.ad ya da undefined.ad sormak hata verir (TypeError).
  • Gelmeyen Hayalet adı olan yerde bekler. Hiç bildirilmemiş bir adı okumak hayalet çağırmaz, hata verir (ReferenceError).
  • Varsayılan parametre yalnızca Gelmeyen Hayalet’i değiştirir. Sandalye Hayaleti bilerek konmuştur, yerinde kalır.

Kod karşılığı

typeof undefined;           // → "undefined"
typeof null;                // → "object"  (tarihsel bir hata)
null == undefined;          // → true;  null === undefined → false
JSON.stringify({ a: undefined, b: null }); // → '{"b":null}'
function f(x = 5) { return x; } f(undefined); // → 5;  f(null) → null

İleri kurallar

  • typeof null === "object" JavaScript’in ilk sürümünden kalan bir hatadır. Web’deki eski kodu bozmamak için düzeltilmedi. null bir nesne değildir.
  • JSON’da undefined yoktur: nesnede o çekmece yazılmaz, dizide null’a çevrilir. null JSON’da olduğu gibi kalır.
  • x ?? "varsayılan" yalnızca bu iki hayalette devreye girer. x || "varsayılan" ise kapıda hayır sayılan her değerde devreye girer: 0, "", false, NaN da dahil.
  • Güvenli sorma: kedi?.ad hayalet çıkarsa hata vermeden undefined döner.

Nerede kırılır

  • Hayalet ölmüş bir şey gibi okunur. İkisi de daha önce orada olup giden bir değer değildir. Burada ölen kimse yok; hayalet, boşluğun adı.
  • Gelmeyen Hayalet bilerek de çağrılabilir. x = undefined yazılabilir; o zaman “hiç gelmedi” anlamı kaybolur. Kural bir alışkanlıktır, dil bunu zorlamaz.
  • typeof yanılgısı. Sandalye Hayaleti kaplumbağa gibi "object" der ama kaplumbağa değildir. Eski bir yazım hatası yüzünden kaplumbağa kaydına geçmiştir; herkes bilir, kimse düzeltemez.
Model sayfası: üç poz, üç ifade.
İlk göründüğü masal Script yerini bilir mi?

Nerede yaşar

Motor Dairesi’nde, değer konabilecek her yerde: değişken, çekmece, vagon. Kendilerine ait bir yerleri yoktur. Sandalye Hayaleti bilerek konduğu yerde oturur.

Gelmeyen Hayalet değeri verilmemiş değişkende, olmayan çekmecede ya da vagonda bekler; haritada kenardaki sisle gösterilir. Sisin ötesi, adı bile olmayan yer, haritadan düşmektir (ReferenceError).

Akrabaları