JavaScript’te Cannot Read Properties of Undefined hatası, JavaScript’in değeri undefined olan bir değişkenin veya ara nesnenin içindeki özelliği okumaya çalıştığını gösterir. Örneğin obj.a.b.c zincirinde sorun çoğu zaman son c özelliğinde değil, zincirin daha önceki halkalarından birinin beklenmedik şekilde undefined olmasındadır.
Kalıcı çözüm için hatayı geçici olarak bastırmak yerine zincirin hangi noktasında değerin kaybolduğunu bulmak gerekir. Bu hata genellikle üç kaynaktan doğar: yanlış veri şekli, yanlış zamanlama veya yanlış DOM seçicisi.
Hata Mesajı Aslında Ne Anlatır?
Şu örnekte JavaScript, user.profile.name ifadesini soldan sağa değerlendirir. Önce user, sonra user.profile okunur. Eğer profile değeri undefined ise JavaScript artık onun içindeki name özelliğine erişemez ve hata verir.
const user = {
profile: undefined
};
console.log(user.profile.name);
Beklenen sonuç, konsolda Cannot read properties of undefined (reading 'name') benzeri bir hata mesajıdır. Burada okunmaya çalışılan özellik name olsa da asıl incelenmesi gereken değer user.profile değişkenidir.
undefined ile null pratikte benzer sorunlara yol açabilir; ikisi de kullanılabilir bir nesneyi temsil etmez. Ancak undefined çoğunlukla bir değerin hiç atanmadığını veya beklenen alanın bulunamadığını düşündürür. null ise geliştiricinin bilinçli olarak “şu anda değer yok” anlamında atadığı bir değerdir. DOM işlemlerinde örneğin bulunamayan bir seçici çoğunlukla null döndürür; bu nedenle hata kaynağını yalnızca mesajı tahmin ederek değil, gerçek değeri inceleyerek belirlemek gerekir.
Hata mesajını gördüğünüzde şu kısa kontrol listesini uygulayın:
- Mesajın tamamını, özellikle
reading 'özellik'bölümünü saklayın. - Dosya adını ve satır numarasını not edin.
- Hatalı satırdaki zinciri parçalara ayırın.
- Her halkanın değerini
console.logveyaconsole.tableile inceleyin. - Değerin beklenen anda üretildiğinden emin olun.
Üç Kaynaklı Teşhis Akışı: Veri mi, Zamanlama mı, Seçici mi?

Aynı hata mesajı farklı nedenlerle ortaya çıkabilir. Bu yüzden ilk sorunuz “hangi korumayı eklemeliyim?” değil, “hangi değer neden beklediğim yerde değil?” olmalıdır.
| Kaynak | Tipik belirti | İlk kontrol | Kalıcı çözüm |
|---|---|---|---|
| Yanlış veri şekli | API veya nesne alanı beklenen yapıyla uyuşmaz | Gelen nesneyi ve alan adlarını incele | Gerçek veri yapısına göre erişim kodunu düzenle |
| Yanlış zamanlama | Veri ya da DOM içeriği kullanılmadan önce hazır değildir | Kodun hangi sırada çalıştığını kontrol et | İşlemi veri veya DOM hazır olduktan sonra başlat |
| Yanlış seçici | querySelector veya getElementById sonucu null olur |
Seçiciyi ve HTML’deki kimliği karşılaştır | Doğru seçici kullan veya çalışma sırasını düzelt |
Hata ayıklarken aşağıdaki sıralama, gereksiz koruma kodları eklemeden nedeni daraltır:
- Hatalı satırı izole edin. Önce hangi ifadenin çöktüğünü belirleyin.
- Zincirin her halkasını inceleyin.
obj.a.b.cifadesini geçici olarakobj,obj.aveobj.a.bşeklinde ayırın. - Tipi ve varlığı kontrol edin.
typeof value,value === undefinedvevalue === nullkontrolleri kullanın. - Üretim zamanını kontrol edin. Özellikle
fetchsonucu veya dinamik HTML henüz oluşmamış olabilir. - DOM seçicisini ve script sırasını doğrulayın. HTML elementi gerçekten mevcut mu, script erken mi çalışıyor?
- Uygun korumayı ekleyin. Sorun veri şekliyse veri eşlemesini, zamanlamaysa akışı, seçiciyse HTML-JavaScript uyumunu düzeltin.
Aşağıdaki örnekte console.table ile zincirin hangi halkasında sorun olduğunu görünür hâle getirebilirsiniz:
const response = {
data: {
items: [{ title: "JavaScript" }]
}
};
const data = response.data;
const items = data.items;
const firstItem = items[0];
console.table({ data, items, firstItem });
console.log(firstItem.title);
Beklenen konsol çıktısında data, items ve firstItem değerleri tablo şeklinde görünür; son satırda JavaScript yazdırılır. Değerlerden biri undefined olsaydı, zincirin kırıldığı nokta hemen fark edilirdi.
Daha ayrıntılı inceleme için hatalı satıra debugger; ekleyip kodu adım adım çalıştırabilir, her değişkenin değerini bir sonraki satıra geçmeden önce kontrol edebilirsiniz. Bu düzenli teşhis alışkanlığı, asenkron video eğitimleri ile çalışırken de özellikle fetch, DOM ve veri akışı hatalarını daha anlaşılır hâle getirir.
Yanlış Veri Şekli ve Dizi İndeksi Hatalarını Bulma
Cannot Read Properties of Undefined hatasının yaygın nedenlerinden biri, kodun beklediği veri şekliyle gerçekte gelen nesnenin farklı olmasıdır. `user.profile.name` zincirinde `user` mevcut olsa bile `profile` alanı yoksa JavaScript, `undefined` değerinin içinden `name` özelliğini okumaya çalışır ve hata verir.
const response = {
user: {
id: 42,
username: "ayse"
}
};
console.log(response.user.profile.name);
Beklenen konsol çıktısı:
TypeError: Cannot read properties of undefined (reading 'name')
Bu durumda ilk kontrol edilmesi gereken şey, alan adlarının gerçekten aynı olup olmadığıdır. API yanıtı `username` gönderirken kodun `userName` beklemesi veya `profile` nesnesinin yalnızca bazı kayıtlarda bulunması aynı türden sorunlara yol açabilir. Zinciri parçalara ayırarak incelemek teşhisi kolaylaştırır:
console.log(response);
console.log(response.user);
console.log(response.user.profile);
Dizilerde benzer hata çoğunlukla sınır dışı indeks kullanımından kaynaklanır. JavaScript dizilerinde ilk elemanın indeksi `0` olduğu için, uzunluğu 3 olan bir dizide geçerli indeksler `0`, `1` ve `2` değerleridir. `arr[10]` ifadesi çoğu durumda `undefined` döndürür; ardından `arr[10].name` yazılırsa aynı hata ortaya çıkar.
- İndeksi okumadan önce `index < array.length` koşulunu kontrol edin.
- Alan adının yazımını ve büyük-küçük harf kullanımını karşılaştırın.
- API yanıtının gerçek veri şeklini, yalnızca varsaydığınız yapıyı değil, inceleyin.
- Birden çok kaydı karşılaştırmak için tek bir
console.logyerineconsole.tablekullanın.
Örneğin ücretsiz kodlama bilgi testi gibi pratiklerle temel veri yapısı ve hata ayıklama alışkanlıklarını pekiştirmek, bu tür zincir hatalarını daha hızlı fark etmeye yardımcı olabilir.
API Yanıtı Henüz Gelmeden Koda Erişmek

fetch ile yapılan isteklerde veri hemen hazır değildir. İstek başlatıldığı anda ilgili değişkeni okumaya çalışmakla, isteğin tamamlanmasından sonra verinin gerçekten gelmemesi aynı durum değildir. İlki çoğunlukla zamanlama sorunu, ikincisi ise yanlış alan adı, boş yanıt veya beklenmeyen veri şekli olabilir.
Framework kullanmadan güvenli akış şu şekilde kurulabilir: önce yanıt beklenir, sonra HTTP durumu kontrol edilir, ardından JSON verisi ayrıştırılır ve en son beklenen alan okunur.
function fakeFetch() {
return Promise.resolve({
ok: true,
json: () => Promise.resolve({ user: { name: "Ayşe" } })
});
}
async function loadUser() {
console.log("İstek başladı");
const response = await fakeFetch();
console.log("Yanıt alındı");
if (!response.ok) throw new Error("İstek başarısız");
const data = await response.json();
console.log("Okunan alan:", data.user.name);
}
loadUser().catch(() => console.log("Kullanıcı bilgisi gösterilemedi"));
Beklenen konsol çıktısı:
İstek başladı
Yanıt alındı
Okunan alan: Ayşe
Teşhis sırasında isteğin başladığı satıra, yanıtın alındığı noktaya ve alanın okunduğu satıra sırayla debugger koyun. Her duraklamada değişkenin o anda undefined olup olmadığını inceleyin. Ayrıca ağ yanıtındaki gerçek yapıyı, kodun beklediği yapı ile karşılaştırın. Böylece “API verisi yok” ile “API isteği henüz tamamlanmadı” ayrımını net biçimde yapabilirsiniz.
DOM Seçicisi Yanlışsa Neden null Görürsünüz?
querySelector veya getElementById ile aranan öğe bulunamadığında sonuç çoğunlukla null olur. Bu durum, bir nesnenin var olduğu fakat içindeki özelliğin undefined olduğu senaryodan farklıdır. Örneğin document.getElementById('kaydet') sonucu null ise JavaScript, bu id değerine sahip bir HTML öğesi bulamamıştır.
En sık neden, HTML ile JavaScript arasında isim uyuşmazlığı olmasıdır. HTML içinde id="save-button" yazarken JavaScript tarafında getElementById('save-btn') kullanmak eşleşme üretmez. Benzer sorun class seçicilerinde de görülür: .product-card yerine .product-cards yazmak, seçicinin boş sonuç vermesine yol açabilir.
document.body.innerHTML = '<button id="save-button">Kaydet</button>';
const button = document.getElementById('save-btn');
console.log(button);
console.log(button ? button.textContent : 'Buton bulunamadı');
Beklenen konsol çıktısı:
null
Buton bulunamadı
Bir başka neden zamanlamadır. JavaScript kodu, henüz HTML öğesi oluşturulmadan çalışırsa doğru seçici kullanılsa bile sonuç null olabilir. Bu özellikle script dosyası sayfanın üst kısmında çalıştırıldığında veya öğe daha sonra JavaScript ile üretildiğinde görülür. Kodu uygun yaşam döngüsü noktasında çalıştırmak, örneğin ilgili HTML yüklendikten sonra seçim yapmak gerekir.
Seçici doğru olsa bile seçilen öğenin beklediğiniz özelliğe sahip olup olmadığını kontrol edin. Bir metin alanında .value anlamlıyken bir div için aynı beklenti doğru olmayabilir. Ayrıca querySelector tek bir öğe döndürür; birden fazla öğeyle çalışmak istiyorsanız seçtiğiniz yöntemin sonucunu buna göre incelemelisiniz.
Teşhis için şu sırayı izleyin:
- JavaScript içinde kullandığınız seçiciyi aynen kopyalayıp kontrol edin.
- HTML’deki
idveyaclassniteliğinin yazımını karşılaştırın. - Seçicinin çalıştığı anda ilgili öğenin gerçekten DOM içinde bulunup bulunmadığını inceleyin.
- Sonucu
console.log(element)ile yazdırıp değerinnullolup olmadığını kontrol edin. - Öğe bulunduysa, kullanmak istediğiniz özelliğin o öğe için anlamlı olup olmadığını doğrulayın.
Burada yalnızca element?.textContent yazmak her zaman çözüm değildir. Optional chaining hatayı bastırabilir; fakat yanlış id, yanlış class veya erken çalışan script sorununu düzeltmez. Kullanıcı açısından önemli bir öğe bulunamadığında sessizce devam etmek yerine anlamlı bir geri dönüş göstermek daha doğrudur.
Optional Chaining ve Nullish Coalescing Nasıl Doğru Kullanılır?
Optional chaining (?.), zincirin belirli bir bölümünde değer null veya undefined olduğunda erişimi güvenli biçimde durdurur. Nullish coalescing (??) ise sonuç bu iki değerden biriyse anlamlı bir varsayılan değer kullanır. Örneğin API yanıtında adres bilgisi eksik gelebiliyorsa şu kullanım güvenlidir:
const data = {
user: {
name: 'Ayşe'
}
};
const city = data.user?.address?.city ?? 'Belirtilmedi';
const email = data.user?.email ?? 'E-posta yok';
console.log(city);
console.log(email);
Beklenen konsol çıktısı:
Belirtilmedi
E-posta yok
Bu yaklaşım, eksik alanın arayüzde kabul edilebilir olduğu durumlarda kullanışlıdır. Kullanıcının şehir bilgisini girmemesi, profil fotoğrafının bulunmaması veya API’nin isteğe bağlı bir açıklama alanı döndürmemesi buna örnek olabilir. Ancak her erişime otomatik olarak ?. eklemek doğru değildir.
Örneğin sipariş ekranında data.order?.items?.[0]?.price kullanmak, zorunlu olması gereken sipariş verisinin neden eksik olduğunu gizleyebilir. Buradaki problem yazım hatası, bozuk veri sözleşmesi veya API yanıtı gelmeden işlem yapılması olabilir. Böyle bir durumda açık doğrulama yapıp anlamlı bir hata üretmek daha güvenlidir.
Karar verirken üç soruyu kullanabilirsiniz:
- Bu alan gerçekten opsiyonel mi?
- Eksikse kullanıcıya gösterilecek varsayılan değer hangi anlamı taşıyor?
- Sessizce devam etmek yerine hata göstermem gereken bir durum mu?
Hata ayıklama sırasında değeri doğrudan varsayılanla değiştirmeden önce ara sonuçları incelemek faydalıdır. console.table nesne ve dizi yapılarını karşılaştırmayı, debugger ise kodu belirli satırda durdurup değişkenleri adım adım incelemeyi kolaylaştırır. Bu yöntemleri ve benzer programlama pratiklerini genel hata ayıklama yazıları arasında da sürdürebilirsiniz.
Sık Sorulan Sorular
Cannot read properties of undefined hatası ile Cannot read properties of null hatası arasındaki fark nedir?
undefined, çoğunlukla var olmayan bir dizi indeksine, eksik API alanına veya değer atanmamış bir değişkene erişildiğini gösterir. null ise özellikle DOM seçicisinin eşleşen öğe bulamadığını belirtir. İkisinde de özellik erişiminden önce değerin gerçekten var olup olmadığı kontrol edilmelidir.
arr[10] neden undefined döndürür ve dizi indeksini nasıl güvenli kontrol edebilirim?
Diziler sıfırdan başlayan indeksler kullanır. Dizi 10 elemanlıysa geçerli son indeks 9 olur; arr[10] bu nedenle undefined döndürebilir. Erişimden önce index >= 0 && index < arr.length kontrolü yapabilir veya isteğe bağlı alanlarda arr[index]?.name kullanabilirsiniz.
fetch ile gelen API verisini kullanmadan önce hazır olup olmadığını nasıl anlarım?
Veriyi, fetch çağrısının döndürdüğü Promise tamamlandıktan sonra kullanın. Genellikle await response.json() sonucunu aldıktan sonra alanları kontrol etmek gerekir. Yanıtın beklenen yapıda olup olmadığını doğrulamadan doğrudan data.user.name gibi erişimler yapmak hataya yol açabilir.
Her yerde optional chaining kullanmak neden sorun oluşturabilir?
Çünkü optional chaining bazı hataları görünmez hâle getirebilir. Zorunlu olması gereken bir alan eksik olduğunda uygulama durup problemi bildirmek yerine undefined üretebilir. Bu nedenle yalnızca eksik olması kabul edilebilir alanlarda kullanılmalı, kritik verilerde açık doğrulama yapılmalıdır.
DOM seçicimin null döndürdüğünü nasıl adım adım teşhis ederim?
Önce seçicinin yazımını, ardından HTML’deki id veya class niteliğini karşılaştırın. Sonra kodun çalıştığı anda öğenin DOM’da bulunup bulunmadığını kontrol edin. Sonucu console.log ile yazdırın; değer null ise eşleşme yoktur. Son olarak script zamanlamasını ve seçilen öğenin beklenen özelliğe sahip olup olmadığını inceleyin.
Bu hata mesajı, çoğu zaman JavaScript’in rastgele bozulduğunu değil, kodun beklediği veri veya öğeyi bulamadığını gösterir. Seçiciyi, zamanlamayı ve veri yapısını sırayla kontrol ettiğinizde sorunun kaynağı genellikle kısa sürede görünür hâle gelir.