Menu

JavaScript null vs undefined: Farkları ve Kullanımı

JavaScript'te null ile undefined arasındaki fark tam olarak nedir, nasıl kontrol edilir ve kendi kodunuzda hangisini tercih etmelisiniz?

"Hiçbir şey" demenin iki yolu

Çoğu programlama dilinde "yok" anlamına gelen tek bir değer vardır. JavaScript'te ise iki tane: null ve undefined. Yeni başlayanları şaşırtacak kadar benzer, tecrübeli geliştiricileri tökezletecek kadar da farklı davranırlar. Aradaki farkı kavramak, ayıracağınız on dakikaya fazlasıyla değer.

Kısa özet:

  • undefined, bir şey eksik olduğunda JavaScript'in size döndürdüğü değerdir.
  • null ise sizin "burası bilerek boş" demek için yazdığınız değerdir.
index.js
Output
Click Run to see the output here.

Buradaki örüntüye dikkat edin: yukarıdaki her undefined, JavaScript bir değer bulamadığı için ortaya çıktı. null ise birisi onu elle yazdığı için oradaydı.

undefined nereden gelir?

undefined, "ortada bir değer yok" temasının farklı varyasyonları olan birkaç belirli durumda karşımıza çıkar:

index.js
Output
Click Run to see the output here.

Her seferinde JavaScript bir değere uzanıyor ve orada hiçbir şey bulamıyor. undefined, motorun "baktım, burada bir değer yoktu" deme şekli.

undefined değerini kendin de atayabilirsin (let x = undefined;), ama bunu yapmamalısın. Bırak undefined "JavaScript bir şey bulamadı" sinyali olarak kalsın. Kararı sen veriyorsan null kullan.

null nereden gelir?

null sadece biri onu yazdığında ortaya çıkar. Olayın özü de bu zaten — bilinçli konulmuş bir işaret.

index.js
Output
Click Run to see the output here.

DOM API'leri null değerini bolca kullanır: document.getElementById("missing") çağrısı size undefined değil null döndürür. Çünkü tarayıcı size açıkça "Aradım, böyle bir eleman yok" diyor. JSON.parse("null") de size null verir — zaten JSON'da undefined diye bir şey yok.

Zihinsel modeli şöyle kurun: undefined varsayılan yokluktur, null ise bilinçli olarak seçilmiş bir yokluktur.

typeof'un Meşhur Tuhaflığı

İşte dilimize pelesenk olan o klasik durum:

index.js
Output
Click Run to see the output here.

typeof null ifadesinin "object" döndürmesi, 1995'ten kalma bir hatadır; mevcut siteleri bozmadan düzeltilmesi mümkün olmadığı için bugüne kadar öylece korunmuştur. Yani null aslında bir nesne değildir — tıpkı undefined, sayılar, string'ler ve boolean'lar gibi bir ilkel (primitive) değerdir. Sadece typeof bu konuda yalan söyler.

İşin pratik tarafı şu: typeof ile null kontrolü yapmak işe yaramaz. Bunun yerine doğrudan karşılaştırma kullanın:

index.js
Output
Click Run to see the output here.

Ya da daha sık karşılaşılan durum: ikisini birden tek seferde kontrol etmek. Gelelim bir sonraki bölüme.

İkisini Birden Kontrol Etme: == null Deyimi

Çoğu zaman elindeki değerin hangi tür "yokluk" olduğu umurunda olmaz — bir şeyi kullanmadan önce sadece eksik olup olmadığını bilmek istersin. Bunun için JavaScript'te yerleşik deyim, null ile gevşek eşitlik (loose equality) kullanmaktır:

index.js
Output
Click Run to see the output here.

value == null ifadesi sadece null ve undefined için true döner; 0, "" ve false dahil diğer her şey için false verir — ki genelde tam olarak istediğimiz davranış budur. İşte == operatörünün === yerine tercih edildiği tek durum budur. Linter'lar da bu kullanımı tanır ve uyarı vermez.

Daha açık yazmak istiyorsan, value === null || value === undefined da aynı anlama gelir ve niyetini net şekilde ifade eder.

Nullish Operatörleri: ?? ve ?.

null ve undefined ile çalışmayı kolaylaştırmak için dile özel olarak iki operatör eklendi. İkisi de bu iki değere aynı şekilde davranır ve geri kalan her şeye dokunmaz.

Nullish coalescing (??) operatörü, yalnızca sol taraftaki değer null veya undefined olduğunda yedek değeri devreye sokar:

index.js
Output
Click Run to see the output here.

|| ile kıyasladığında farkı hemen görürsün: || kullansaydın, 0 da falsy sayıldığı için yerine 3 yazılırdı. ?? ise çok daha katı; yalnızca iki nullish değer (null ve undefined) için devreye girer.

Optional chaining (?.) ise zincirin ortasında null ya da undefined ile karşılaşırsa değerlendirmeyi orada kesip undefined döner:

index.js
Output
Click Run to see the output here.

Her iki operatör de "bu değer nullish mi?" sorusunun ne kadar sık sorulduğunu gösteriyor. Müfredatın ilerleyen bölümlerinde bunları detaylıca ele alacağız.

Varsayılan parametreler yalnızca undefined için devreye girer

İnce ama önemli bir kural var: fonksiyonlarda varsayılan parametre değerleri sadece undefined geldiğinde çalışır, null geldiğinde değil.

index.js
Output
Click Run to see the output here.

null geçildiğinde bu "bilerek değer vermedim" şeklinde yorumlanır ve olduğu gibi kullanılır. null değerinin de varsayılana düşmesini istiyorsan, fonksiyonun içinde ?? operatörünü kullan:

index.js
Output
Click Run to see the output here.

Bu ayrım, insanların sürekli takıldığı bir konu. Varsayılan değerler eksik argümanları, ?? ise nullish argümanları yakalar.

JSON ve Kayıp undefined

JSON'da null vardır ama undefined yoktur. İşte tam da bu yüzden serialize ederken sessiz sedasız sürprizlerle karşılaşırsın:

index.js
Output
Click Run to see the output here.

age alanı tamamen uçtu — çünkü JSON.stringify, değeri undefined olan property'leri atar. null ise JSON tarafından desteklendiği için hayatta kalır. Bir nesneyi JSON'a çevirip geri almak, undefined değerli property'lerin sessizce kaybolmasının en sık rastlanan yoludur.

Dizilerde ise undefined değerler null'a dönüşür:

index.js
Output
Click Run to see the output here.

Bir API payload'ı tasarlıyorsan, "değer yok" alanlarda undefined yerine null kullanmayı tercih et. Yolculuktan sağ çıkan o.

Hangisi Ne Zaman Kullanılır?

Kendi kodun için makul bir konvansiyon şöyle olabilir:

  • undefined, "verilmedi" anlamına gelsin — eksik argümanlar, atanmamış değişkenler, mevcut olmayan property'ler. undefined değerini elle atama.
  • null'u ise "burası bilerek boş bırakıldı" demek istediğinde kullan — oturumu kapalı bir kullanıcı, seçilmemiş bir seçenek, temizlenmiş bir form alanı gibi.
  • API sınırlarında her ikisini de kabul et (== null ya da ?? kullan), ama kendin üretirken hangisini ürettiğin konusunda tutarlı ol.

Bazı stil rehberleri (TypeScript'inki dahil) null'ı tamamen es geçip sadece undefined kullanır. Bunun da savunulur bir tarafı var — tek bir değer, ikisinden daha sade. Her proje için bir kural belirle ve her yerde aynı şekilde uygula.

Sırada: Tip Dönüşümü (Type Coercion)

null ve undefined, JavaScript onları sayıya, string'e ya da boolean'a çevirdiğinde kendine has şekillerde davranır — Number(null) sonucu 0 verir, ama Number(undefined) sonucu NaN olur. Bu tür asimetriler gerçek bug'lara yol açıyor. Sırada tip dönüşümü (type coercion) var. Kuralların tamamını bir kez gördüğünde, JavaScript'in pek çok garipliği gizemini kaybedecek.

Sıkça Sorulan Sorular

JavaScript'te null ile undefined arasındaki fark nedir?

undefined, bir değerin henüz atanmadığı anlamına gelir — tanımsız değişkenler, eksik argümanlar veya var olmayan nesne özellikleri için JavaScript size undefined döner. null ise sizin bilerek atadığınız, açıkça 'burada değer yok' demenin yoludur. JavaScript kendiliğinden null üretmez; onu siz yazmak zorundasınız.

null ve undefined'ı tek seferde nasıl kontrol ederim?

value == null yazmanız yeterli. Loose equality (==) null ile undefined'ı birbirine eşit sayar ama başka hiçbir değere eşitlemez — yani x == null yalnızca bu iki değer için true döner. == yerine === kullanma alışkanlığının istisnası budur; burada deyimsel ve güvenlidir.

typeof null neden 'object' döndürüyor?

Bu, JavaScript'in ilk sürümünden kalma bir hata; düzeltilse web'in yarısı bozulacağı için öyle kaldı. null aslında bir primitive olmasına rağmen typeof null size 'object' verir. Sadece null kontrolü yapmak istiyorsanız doğrudan karşılaştırın: value === null.

Kendi kodumda null mı undefined mı kullanmalıyım?

undefined'ı 'hiç verilmedi', null'ı ise 'bilinçli olarak boş bırakıldı' anlamında kullanın. Birçok proje (ve TypeScript'in kendi stil rehberi) null'dan tamamen kaçınıp sadece undefined kullanır. Önemli olan proje içinde tek bir kural belirleyip ona sadık kalmak.

Coddy ile kodlamayı öğren

BAŞLA