İçeriğe geç
XDD.baby Yazılım Öğrenme
Sözlük Hata rehberi 0/56

Blok 1 · Ders 4

Obje: bir şampiyonun bütün bilgisi tek kutuda

Birbiriyle ilgili bilgileri { anahtar: değer } biçiminde tek bir objede topluyor, okuyor, değiştiriyor ve fonksiyonlara veriyorsun.

Bu dersin sonunda

  • Birbirine ait bilgileri { anahtar: değer } biçiminde tek bir objede toplayabilirsin
  • Bir alanı nokta ya da köşeli parantezle okuyup değiştirebilir, yeni alan ekleyip silebilirsin
  • undefined gördüğünde nedenini bulabilir, Cannot read properties of undefined hatasını düzeltebilirsin
  • Eşya ve konum gibi iç içe objelerle çalışabilirsin
  • Objeyi fonksiyona verip onu yazdıran ya da değiştiren fonksiyonlar yazabilirsin
  • console.log ile yazdırılan bir objenin çıktısını okuyabilirsin
Bu sayfada
  1. Ayrı değişkenler neden dağılır?
  2. İlk objen
  3. Node objeyi nasıl gösterir?
  4. Nokta ile okumak ve değiştirmek
  5. const obje neden değişebiliyor?
  6. Yeni alan eklemek, alan silmek
  7. Olmayan alan: undefined
  8. Köşeli parantezle okumak
  9. İç içe obje: eşya ve konum
  10. Objeyi fonksiyona vermek
  11. Sık hatalar
  12. Görevler
  13. Kendini sına
  14. Kayıt noktası

Şimdiye kadar her bilgiyi ayrı bir değişkende tuttun: can bir kutuda, altın başka bir kutuda. Tek bir şampiyon için bu yetiyor. Ama bir maçta on şampiyon var ve her birinin adı, canı, altını, eşyası ve haritadaki yeri var.

Bu derste birbirine ait bilgileri tek bir yerde toplamayı öğreneceksin: obje. Dersin sonunda bir şampiyonun bütün bilgisini tek bir değişkende tutabilecek, okuyup değiştirebilecek ve fonksiyonlara verebileceksin.

Ayrı değişkenler neden dağılır?

VS Code'da C:\kod\ogren klasörüne ders4.js adında yeni bir dosya ekle. Bu dersin örneklerini bu dosyada yazacaksın; yeni bir örneğe geçerken eski kodu silebilir ya da satır başlarına // koyabilirsin.

Ahri ve Lux için birer bilgi kartı yazdıran bir program düşün. Şimdiye kadar öğrendiklerinle her bilgi ayrı bir değişken olur, kartı da Ders 3'teki gibi bir fonksiyon yazdırır:

ders4.js
function kartYazdir(isim, hp, gold) {    console.log(isim + " | can: " + hp + " | altın: " + gold)} const ahriIsim = "Ahri"let ahriHp = 100let ahriGold = 300const luxIsim = "Lux"let luxHp = 90let luxGold = 250kartYazdir(ahriIsim, ahriHp, ahriGold)kartYazdir(luxIsim, luxHp, luxGold)
Çıktı
Ahri | can: 100 | altın: 300Lux | can: 90 | altın: 250

Program çalışıyor ama üç sorunu var:

  • Değişkenler çoğalır. On şampiyon, her birinde üç bilgi: otuz değişken. Oyuna mana eklemek istersen on değişken daha.
  • Aradaki bağ görünmez. ahriHp ile ahriGold'un aynı şampiyona ait olduğunu yalnızca adlarının başındaki ahri'den anlıyorsun. JavaScript için bunlar birbirinden habersiz altı ayrı kutu.
  • Argümanlar karışır. Fonksiyon her bilgiyi ayrı bir parametre olarak istiyor. Ders 3'te gördüğün gibi argümanların sırasını karıştırırsan JavaScript seni uyarmaz.

Üçüncüsünü kendin gör. Dosyanın sonuna şu satırı ekle ve yeniden çalıştır:

ders4.js
kartYazdir(ahriIsim, ahriGold, ahriHp)
Çıktıya eklenen satır
Ahri | can: 300 | altın: 100

Can ile altın yer değiştirdi: Ahri'nin canı 300 göründü. Hata mesajı yok, program yanlış sonucu sessizce yazdı; bu, Ders 2'de tanıdığın bir mantık hatası. Sekiz bilgisi olan bir şampiyonda sekiz argümanı her seferinde doğru sırayla vermek gerçekten zor.

Ders 3'ün son görevindeki esyaAl da aynı sorunu taşıyordu: beş parametre vardı ve esyaAl("B. F. Kılıcı", 1300, 1300, false, true) satırındaki false ile true'nun ne anlama geldiği tanıma bakmadan anlaşılmıyordu. Bu dersin son görevinde dükkânı objelerle yeniden kuracaksın.

Çözüm, bir şampiyonun bütün bilgisini tek bir kutuda toplamak. Aşağıdaki şeklin sağ yarısı, bu derste kuracağın düzen:

Ayrı değişkenler ahriIsim "Ahri" luxIsim "Lux" ahriHp 100 luxHp 90 ahriGold 300 luxGold 250 + garenIsim, garenHp, garenGold … 10 şampiyon, 3'er bilgi: 30 değişken Objeler ahri isim: "Ahri" hp: 100 gold: 300 lux isim: "Lux" hp: 90 gold: 250 Her şampiyon tek bir obje Yeni bilgi: karta yeni bir satır Fonksiyona tek ad yeter: ahri
Şekil 4.1 Solda her bilgi ayrı bir değişken. Sağda her şampiyonun bütün bilgisi kendi objesinde.

İlk objen

ders4.js dosyasındaki kodu sil ve şunu yaz:

ders4.js — ogren — Visual Studio Code
ders4.js
const ahri = {    isim: "Ahri",    hp: 100,    gold: 300}console.log(ahri)
PROBLEMSOUTPUTDEBUG CONSOLETERMINAL
PS C:\kod\ogren> node ders4.js{ isim: 'Ahri', hp: 100, gold: 300 }
Ln 1, Col 1Spaces: 4UTF-8JavaScript

Tek bir değişken (ahri), içinde üç bilgi. Kodu alt alta yazdın; console.log objenin tamamını tek satırda yazdırdı.

Süslü parantezlerin ({ }) arasına yazılan şeye obje (object) denir. ahri kutusunda artık tek bir değer var, ama bu değer üç bilgi taşıyor.

Her bilgi bir anahtar (key) ile bir değerden (value) oluşur ve ikisinin arasına iki nokta (:) konur: isim: "Ahri" satırında anahtar isim, değer "Ahri". Her anahtar–değer çiftine alan (property) denir; alanlar birbirinden virgülle ayrılır.

Kısa bir objeyi tek satıra da yazabilirsin; JavaScript için iki yazım aynı objedir:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }console.log(ahri)
Çıktı
{ isim: 'Ahri', hp: 100, gold: 300 }

Bu derste kısa objeleri tek satıra, uzunlarını alt alta yazacağız. Tek satırlık hâlin parçaları şunlar:

bir alan (anahtar: değer) {isim:"Ahri",hp:100,gold:300} { } obje burada başlar ve biter isim anahtar: bilginin adı, tırnaksız : anahtarla değerin arasına iki nokta "Ahri" değer: metin, sayı, true ya da false , alanları birbirinden ayırır
Şekil 4.2 Bir objenin parçaları. Her alan bir anahtar ve bir değerden oluşur.

Yazım kuralları

ParçaÖrnekKural
Süslü parantez{ }Obje { ile açılır, } ile kapanır.
Anahtarisim, hpDeğişken adı gibi yazılır: harfle başlar, boşluk yok, camelCase, İngilizce harfler. Tırnak gerekmez.
İki nokta:Anahtar ile değerin arasına gelir. = değil.
Değer"Ahri", 100, trueMetin, sayı, true ya da false. Birazdan göreceğin gibi başka bir obje de olabilir.
Virgül,Alanların arasına gelir.

= ile : farkını aklında tut: = bir kutuya değer koyar (const ahri = …), : ise objenin içinde bir anahtara değer verir.

Alt alta yazarken

Alan sayısı arttıkça tek satır okunmaz hâle gelir; o zaman ilk penceredeki gibi her alanı ayrı bir satıra yaz:

  • { ilk satırın sonunda açılır; } kendi satırında, const ile aynı hizada kapanır.
  • Her alan 4 boşluk içeriden başlar. VS Code, Enter'a basınca girintiyi kendisi verir.
  • Her satırın sonunda virgül var, sonuncusu hariç.

İki yazımda da Node çıktıyı tek satırda verdi. Kodu nasıl dizdiğin çıktıyı etkilemez; Node objeyi kendi düzeniyle gösterir.

Obje yazarken en sık yapılan iki hata şunlar:

Sık hataSyntaxError: Invalid shorthand property initializer

Ne zaman çıkar? Objenin içinde anahtar ile değerin arasına : yerine = yazınca. Değişken oluştururken = yazmaya alışan parmak bunu sık yapar.

ders4.js
const ahri = {    isim: "Ahri",    hp = 100,    gold: 300}console.log(ahri)
Hata çıktısı
C:\kod\ogren\ders4.js:3    hp = 100,    ^^^^^^^^ SyntaxError: Invalid shorthand property initializer    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Nasıl düzelir? ^ işaretleri hp = 100 kısmının altında. Invalid "geçersiz" demek: JavaScript, objenin içindeki bu yazımı geçersiz buldu. Objenin içinde değer iki noktayla verilir: hp: 100. Mesajın geri kalanını ezberlemen gerekmez; bu mesajı görünce objenin içinde bir = ara.

Sık hataSyntaxError: Unexpected identifier 'hp'

Ne zaman çıkar? İki alanın arasındaki virgülü unutunca. JavaScript "Ahri"'den sonra virgül ya da } bekliyordu, karşısına yeni bir ad (hp) çıktı. Identifier "ad" demek; mesaj "beklenmeyen ad: hp" diyor.

ders4.js
const ahri = {    isim: "Ahri"    hp: 100,    gold: 300}console.log(ahri)
Hata çıktısı
C:\kod\ogren\ders4.js:3    hp: 100,    ^^ SyntaxError: Unexpected identifier 'hp'    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Nasıl düzelir? Dikkat: mesaj 3. satırı gösteriyor ama eksik virgül 2. satırın sonunda. JavaScript eksikliği ancak bir sonraki adı görünce fark eder. Bu yüzden obje hatalarında ^'nın gösterdiği satırla birlikte bir üst satıra da bak. Virgül yerine noktalı virgül (;) koyarsan bu kez SyntaxError: Unexpected token ';' alırsın; çözüm yine virgül.

Node objeyi nasıl gösterir?

İlk objeni yazdırınca çıktının senin yazdığına benzediğini ama birebir aynı olmadığını görmüşsündür:

Senin yazdığın
const ahri = { isim: "Ahri", hp: 100, gold: 300 }
Node'un yazdığı
{ isim: 'Ahri', hp: 100, gold: 300 }
  • Metinler tek tırnakla gösterilir: 'Ahri'. Sen çift tırnakla yazdın, Node kendi tercihini kullanıyor. İkisi de aynı metin.
  • Sayılar tırnaksız gösterilir: 100. Ders 1'de 100 ile "100" ekranda aynı görünüyordu; objenin içinde fark görünür. hp: '100' görürsen can bir metin olarak yazılmış demektir.
  • Anahtarlar tırnaksız gösterilir. Süslü parantezlerin içindeki ve virgüllerden sonraki boşlukları Node okunsun diye kendisi koyar.
  • VS Code terminalinde renkler de yardım eder: metinler yeşil, sayılar ile true ve false sarı görünür.

Çıktıda karşına çıkabilecek öteki biçimler:

Çıktıda gördüğünAnlamı
hp: '100'Değer metin: sayı tırnak içinde yazılmış. Hesap yaparken sorun çıkarır.
canli: trueDeğer true ya da false.
isim: "Kai'Sa"Metnin içinde tek tırnak var; karışmasın diye Node çift tırnağa geçti.
'altın': 300Anahtarda Türkçe harf ya da boşluk var; Node anahtarı tırnağa aldı. Anahtarlarda İngilizce harf kullan.
konum: { x: 120, y: 340 }İç içe obje. Birazdan göreceksin.
etki: [Object]Çok derindeki bir obje kısaltılmış. Birazdan göreceksin.

Objeyi bir açıklamayla birlikte yazdırmak istersen Ders 1'deki virgül yöntemini kullan:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }console.log("Şampiyon:", ahri)
Çıktı
Şampiyon: { isim: 'Ahri', hp: 100, gold: 300 }

Burada + kullanma; ne olduğunu sık hatalarda göreceksin.

Nokta ile okumak ve değiştirmek

Objenin içinden tek bir bilgiyi almak için objenin adını, bir nokta ve anahtarı yazarsın:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }console.log(ahri.isim)console.log(ahri.hp)console.log(ahri.isim + " " + ahri.gold + " altınla dükkâna girdi")
Çıktı
Ahri100Ahri 300 altınla dükkâna girdi

Bu yazıma nokta gösterimi (dot notation) denir. Çıktıya da bak: ahri.isim yazdırınca tırnak çıkmadı. Node tırnakları yalnız bir objenin içini gösterirken kullanır; tek başına bir metni olduğu gibi yazar.

Kendin dene: son satırdaki ahri.gold yerine ahri.Gold yaz ve çalıştır. Hata almayacaksın ama çıktı Ahri undefined altınla dükkâna girdi olacak. undefined'ı Ders 3'ten tanıyorsun; burada neden çıktığını birkaç bölüm sonra göreceksin.

Bir alanı değiştirmek de aynı yazımla olur. = işareti Ders 1'deki anlamını korur: sağı hesapla, sola koy.

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }ahri.hp = ahri.hp - 30ahri.gold = ahri.gold + 150console.log(ahri)
Çıktı
{ isim: 'Ahri', hp: 70, gold: 450 }

İkinci satırı sağdan sola oku: Ahri'nin canını al (100), 30 çıkar, sonucu Ahri'nin canına koy. Üçüncü satırda Ahri bir kule yıktı ve 150 altın kazandı.

const obje neden değişebiliyor?

Bir dakika: ahri const ile açıldı. Ders 1'de const kutunun mühürlü olduğunu, içine konan değerin değişemeyeceğini öğrendin. Peki ahri.hp = … neden hata vermedi?

Çünkü const yalnız kutuya başka bir değer konmasını yasaklar. ahri kutusunda bir obje duruyor ve o hep aynı obje. Sen kutuya başka bir obje koymadın; kutudaki objenin içindeki bir alanı değiştirdin. Kutuya bambaşka bir obje koymaya kalkarsan Ders 1'den tanıdığın hata gelir:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }ahri.hp = 80console.log(ahri)ahri = { isim: "Lux", hp: 90, gold: 250 }
Hata çıktısı
{ isim: 'Ahri', hp: 80, gold: 300 }C:\kod\ogren\ders4.js:4ahri = { isim: "Lux", hp: 90, gold: 250 }     ^ TypeError: Assignment to constant variable.    at Object.<anonymous> (C:\kod\ogren\ders4.js:4:6)    ... Node.js v24.20.0

Program 2. satırı çalıştırdı ve Ahri'nin canı 80 oldu; çıktının ilk satırı bunu gösteriyor. 4. satırda ise ahri kutusuna Lux'un objesi konmak istendi: yasak.

const ahri isim: "Ahri" hp: 100 80 gold: 300 ahri.hp = 80 ✓ Kartın içi değişir: olur ahri = { isim: "Lux" } ✗ Kutuya başka obje: TypeError
Şekil 4.3 const kutuya başka bir obje konmasını yasaklar. Kutudaki objenin alanları değişebilir.

Yeni alan eklemek, alan silmek

Program ilerledikçe şampiyonun kartına yeni bilgiler eklemek isteyeceksin: seviyesi, manası, aldığı bir güçlendirme. Bunun için objeyi baştan yazman gerekmez. Objede olmayan bir anahtara değer verirsen JavaScript o alanı ekler:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }ahri.seviye = 1ahri.mana = 400console.log(ahri)
Çıktı
{ isim: 'Ahri', hp: 100, gold: 300, seviye: 1, mana: 400 }

Ekleme ile değiştirmenin yazımı aynı: ahri.seviye = 1. Anahtar varsa değeri değişir, yoksa yeni alan eklenir. Yeni alanlar sona eklenir.

Bazen de bir bilgi artık geçerli olmaz ve objede durmamalıdır; örneğin bir güçlendirmenin süresi biter. Bir alanı tamamen kaldırmak için önüne delete (sil) yazarsın. Dene: aynı dosyanın sonuna şu iki satırı ekle, gold alanını sil ve yeniden çalıştır:

ders4.js
delete ahri.goldconsole.log(ahri)
Çıktıya eklenen satır
{ isim: 'Ahri', hp: 100, seviye: 1, mana: 400 }

delete ahri.gold alanı anahtarıyla birlikte siler; çıktıda gold artık yok. const objeye alan eklemek ve ondan alan silmek de serbest, çünkü kutudaki obje yine aynı obje.

Olmayan alan: undefined

Garen'in mana barı yoktur; objesinde de mana alanı olmasın. Şimdi o alanı okumaya çalış:

ders4.js
const garen = { isim: "Garen", hp: 620 }console.log(garen.mana)console.log("Garen'in manası: " + garen.mana)
Çıktı
undefinedGaren'in manası: undefined

Hata yok. JavaScript olmayan bir alanı okuyunca durmaz; sana undefined verir. Anlamı "tanımsız", yani "burada değer yok". Metinle birleştirince undefined sözcüğü olduğu gibi metne eklenir.

Bu değerle Ders 3'te, argümanı verilmeyen bir parametrenin içinde tanışmıştın. Şimdi ikinci bir kaynağını görüyorsun: objede olmayan bir alan.

Kod Sonuç garen isim "Garen" hp 620 mana yok garen.hp garen.mana 620 undefined
Şekil 4.4 Nokta, kartta o anahtarın satırını arar. Satır varsa değerini, yoksa undefined verir.

Burada Ders 1'den önemli bir fark var:

YazdığınSonuç
console.log(mana), böyle bir değişken yokReferenceError: mana is not defined, program durur.
console.log(garen.mana), böyle bir alan yokundefined yazar, program devam eder.

Bu sessizlik tehlikeli olabilir. Anahtarı yanlış yazarsan (garen.Hp) hata almazsın, undefined alırsın. Çıktında beklemediğin bir undefined görürsen ilk şüphelin yazım hatası olsun. delete ile sildiğin bir alanı okursan da undefined alırsın.

Bir alanın olup olmadığını Ders 2'deki === ile denetleyebilirsin:

ders4.js
const garen = { isim: "Garen", hp: 620 }if (garen.mana === undefined) {    console.log(garen.isim + " mana kullanmaz")} else {    console.log(garen.isim + " manası: " + garen.mana)}
Çıktı
Garen mana kullanmaz

Köşeli parantezle okumak

Bir alanı okumanın ikinci yolu köşeli parantezdir: anahtarı metin olarak [ ] içine yazarsın. Türkçe Q klavyede [ için AltGr+8, ] için AltGr+9'a basarsın.

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }console.log(ahri["hp"])console.log(ahri.hp)
Çıktı
100100

İkisi de aynı alanı okur. Bu yazıma köşeli parantez gösterimi (bracket notation) denir. Peki neden iki yol var? Çünkü bazen hangi alanı okuyacağını kodu yazarken bilmezsin; anahtar bir değişkenin içinde gelir.

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }let sutun = "gold"console.log(sutun + ": " + ahri[sutun])sutun = "hp"console.log(sutun + ": " + ahri[sutun])
Çıktı
gold: 300hp: 100

ahri[sutun] iki kez aynı yazıldı ama iki farklı alan okundu. JavaScript önce sutun kutusuna bakar, içinde "gold" bulur ve ahri["gold"]'u okur. sutun'a "hp" konunca aynı yazım canı okur. Dene: sona sutun = "isim" ve aynı console.log satırını bir kez daha ekle; isim: Ahri çıkmalı.

Bu örnekte sutun'un değerini kendin yazdın. Gerçek programlarda bu değer dışarıdan gelir: oyuncunun tıkladığı sekmeden ya da bir fonksiyonun parametresinden. Kodu yazarken hangi alanın isteneceğini bilmediğin her yerde köşeli parantez kullanırsın; dersin son görevinde bunu kendin kuracaksın.

Burada Ders 1'deki tırnak kuralı aynen geçerli. Bu üç satırın farkına bak:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }const alan = "gold"console.log(ahri[alan])console.log(ahri["alan"])console.log(ahri.alan)
Çıktı
300undefinedundefined
YazımAranan anahtarSonuç
ahri[alan]alan kutusunun içindeki metin: gold300
ahri["alan"]harfi harfine alanundefined
ahri.alanharfi harfine alanundefined

Kural: nokta, yazdığın sözcüğü harfi harfine anahtar sayar. Anahtar bir değişkenin içindeyse köşeli parantez şarttır ve içine değişkenin adı tırnaksız yazılır. Köşeli parantezle değer de verebilirsin: ahri[alan] = 500 satırı gold'u 500 yapar. Köşeli parantezi Ders 5'te dizilerde de kullanacaksın.

İç içe obje: eşya ve konum

Bir alanın değeri başka bir obje de olabilir. Ahri'nin haritadaki yeri iki sayıdan oluşur (x ve y); taşıdığı eşyanın da bir adı ve bir hasarı var. Bunlar Ahri'nin içinde kendi küçük objeleri olabilir:

ders4.js
const ahri = {    isim: "Ahri",    hp: 100,    konum: { x: 120, y: 340 },    esya: { ad: "Büyü Kitabı", hasar: 20 }}console.log(ahri.konum)console.log(ahri.konum.x)console.log(ahri.esya.ad + " +" + ahri.esya.hasar + " hasar")ahri.konum.x = 200console.log(ahri)
Çıktı
{ x: 120, y: 340 }120Büyü Kitabı +20 hasar{  isim: 'Ahri',  hp: 100,  konum: { x: 200, y: 340 },  esya: { ad: 'Büyü Kitabı', hasar: 20 }}
  • ahri.konum konum objesinin tamamını verir.
  • ahri.konum.x önce konumu, sonra onun x'ini bulur. Noktaları soldan sağa oku: "Ahri'nin konumunun x'i".
  • ahri.konum.x = 200 iç objedeki tek bir alanı değiştirir.
  • Son çıktı alt alta yazıldı. Objenin tek satırlık hâli yaklaşık 70 karakteri geçecekse Node her alanı ayrı bir satıra yazar ve iç objeleri yine süslü parantezle gösterir. Girinti 2 boşluk; bu Node'un tercihi, senin kodun 4 boşlukla kalır.
ahri isim "Ahri" hp 100 konum x: 120 y: 340 esya ad: "Büyü Kitabı" hasar: 20 Noktaları soldan sağa izle: ahri.konum.x sonuç: 120 ahri.esya.ad sonuç: "Büyü Kitabı"
Şekil 4.5 İç içe obje: kartın içinde kart. Noktalar dıştan içe doğru ilerler.

İç objeyi sonradan da ekleyebilirsin; yazımı yeni alan eklemekle aynı:

ders4.js
const garen = { isim: "Garen", hp: 620 }garen.esya = { ad: "Uzun Kılıç", hasar: 10 }console.log(garen)
Çıktı
{ isim: 'Garen', hp: 620, esya: { ad: 'Uzun Kılıç', hasar: 10 } }

Olmayan objenin içine bakmak

Garen'in eşyası yoksa garen.esya undefined verir. Bir adım daha ileri gidip eşyanın adını okumaya kalkarsan program durur:

ders4.js
const garen = { isim: "Garen", hp: 620 }console.log(garen.esya)console.log(garen.esya.ad)
Hata çıktısı
undefinedC:\kod\ogren\ders4.js:3console.log(garen.esya.ad)                       ^ TypeError: Cannot read properties of undefined (reading 'ad')    at Object.<anonymous> (C:\kod\ogren\ders4.js:3:24)    ... Node.js v24.20.0

Mesajı çevir: "undefined'ın alanları okunamaz (ad okunurken)". JavaScript ad'ı okumak istedi ama bakacağı yerde bir obje değil undefined vardı. undefined'ın içi yoktur, içine bakılamaz.

ahri.esya.ad ahri bir obje ✓ .esya o da bir obje ✓ .ad "Büyü Kitabı" ✓ garen.esya.ad garen bir obje ✓ .esya undefined: yok .ad ✗ TypeError undefined bir obje değil, içine bakılamaz: Cannot read properties of undefined (reading 'ad')
Şekil 4.6 Zincirdeki her nokta bir öncekinin içine bakar. Aradaki basamak undefined ise bir sonraki adım TypeError verir.

Bu hatayı gördüğünde kendine şunu sor: .ad'ın solundaki şey neden undefined? ^ işareti okunamayan alanın tam altında durur. Sebep çoğu zaman şunlardan biridir:

  • Ara obje hiç eklenmemiş: Garen'in eşyası yok.
  • Anahtar yanlış yazılmış: ahri.konm.x (konum değil, konm).
  • Obje bekleyen bir fonksiyon objesiz çağrılmış. Fonksiyona obje vermeyi bir sonraki bölümde öğreneceksin, bu hatayı da sık hatalarda göreceksin.

Çözüm, ara basamağın var olup olmadığını önce denetlemek:

ders4.js
const garen = { isim: "Garen", hp: 620 }if (garen.esya === undefined) {    console.log(garen.isim + " eşyasız")} else {    console.log(garen.isim + " eşyası: " + garen.esya.ad)}
Çıktı
Garen eşyasız

Bunun daha kısa bir yazımı (?.) var; onu Ders 12'de öğreneceksin.

Objeyi fonksiyona vermek

Ders 3'te fonksiyonlara sayı ve metin verdin. Obje de bir değer; onu da argüman olarak verebilirsin. Baştaki kart yazdırma problemine dön:

ders4.js
function kartYazdir(sampiyon) {    console.log(sampiyon.isim + " | can: " + sampiyon.hp + " | altın: " + sampiyon.gold)} const ahri = { isim: "Ahri", hp: 100, gold: 300 }const lux = { isim: "Lux", hp: 90, gold: 250 }kartYazdir(ahri)kartYazdir(lux)
Çıktı
Ahri | can: 100 | altın: 300Lux | can: 90 | altın: 250

Üç parametre yerine tek parametre: bütün şampiyon. Argümanların sırası karışamaz, çünkü tek bir şey veriyorsun. Şampiyonlara yeni bir alan eklesen bile fonksiyonu çağıran satırlar değişmez.

Fonksiyonun içinde her alanın önüne sampiyon. yazmak satırları uzatıyor. Bu tekrarı kısaltmanın yolunu Ders 12'de göreceksin; şimdilik her alanı bu tam yazımla oku.

Fonksiyon objeyi değiştirebilir

Fonksiyon, aldığı objenin alanlarını değiştirebilir de:

ders4.js
function hasarAl(sampiyon, hasar) {    sampiyon.hp = sampiyon.hp - hasar    console.log(sampiyon.isim + " " + hasar + " hasar aldı, canı " + sampiyon.hp)} const ahri = { isim: "Ahri", hp: 100, gold: 300 }hasarAl(ahri, 30)hasarAl(ahri, 25)console.log(ahri)
Çıktı
Ahri 30 hasar aldı, canı 70Ahri 25 hasar aldı, canı 45{ isim: 'Ahri', hp: 45, gold: 300 }

Son satıra bak: fonksiyonun içinde yapılan değişiklik dışarıdaki ahri'de de görünüyor. Fonksiyona objenin kopyası değil, kendisi gitti. Çağrı boyunca sampiyon parametresi, ahri objesinin ikinci bir adı gibi davrandı.

Sayı verince fonksiyon kopyasını alır ahriHp 100 hasarAlSayi hp 100 70 kopya Dışarıdaki ahriHp hâlâ 100 Obje verince fonksiyon aynı objeyle çalışır ahri hp: 100 70 gold: 300 hasarAl sampiyon aynı objeyi gösterir Dışarıdaki ahri.hp de 70
Şekil 4.7 Sayı verince fonksiyon kopyasıyla çalışır. Obje verince dışarıdaki objenin kendisiyle çalışır.

Fonksiyondan bir sonucu geri almanın asıl yolunu (return) Ders 6'da öğreneceksin. O zamana kadar bir fonksiyonun objenin alanlarını güncellemesi işini görecek.

Sık hatalar

Yazım hatalarını obje yazmayı öğrendiğin bölümde, iç içe objedeki TypeError'ı kendi bölümünde gördün. Kalanlar burada. Bir hata aldığında bütün derslerin hatalarının toplandığı hata rehberine de bakabilirsin.

Sık hataTypeError: Cannot read properties of undefined (reading 'isim')

Ne zaman çıkar? Obje bekleyen bir fonksiyonu argüman vermeden çağırınca. Ders 3'ten hatırla: verilmeyen parametre undefined olur. Fonksiyon da undefined'ın alanını okumaya çalışır.

ders4.js
function kartYazdir(sampiyon) {    console.log(sampiyon.isim + " | can: " + sampiyon.hp + " | altın: " + sampiyon.gold)} const ahri = { isim: "Ahri", hp: 100, gold: 300 }kartYazdir(ahri)kartYazdir()
Hata çıktısı
Ahri | can: 100 | altın: 300C:\kod\ogren\ders4.js:2    console.log(sampiyon.isim + " | can: " + sampiyon.hp + " | altın: " + sampiyon.gold)                         ^ TypeError: Cannot read properties of undefined (reading 'isim')    at kartYazdir (C:\kod\ogren\ders4.js:2:26)    ... Node.js v24.20.0

Nasıl düzelir? at kartYazdir satırı hatanın kartYazdir fonksiyonunun içinde çıktığını söylüyor, ^ işareti isim'in altında. Demek ki sampiyon undefined. Fonksiyonu çağırdığın satırlara bak: hangisinde parantezin içi boş? Oraya objeyi yaz: kartYazdir(ahri). Aynı mesajın öteki sebepleri için olmayan objenin içine bakmak bölümüne dön.

Sık hataTypeError: Cannot set properties of undefined (setting 'ad')

Ne zaman çıkar? Var olmayan bir iç objenin alanına değer vermeye çalışınca. Okumadaki hatanın yazma hâli.

ders4.js
const garen = { isim: "Garen", hp: 620 }garen.esya.ad = "Uzun Kılıç"
Hata çıktısı
C:\kod\ogren\ders4.js:2garen.esya.ad = "Uzun Kılıç"              ^ TypeError: Cannot set properties of undefined (setting 'ad')    at Object.<anonymous> (C:\kod\ogren\ders4.js:2:15)    ... Node.js v24.20.0

Nasıl düzelir? garen.esya yok; olmayan bir şeyin içine yazılamaz. Önce iç objeyi oluştur, sonra alanlarını değiştir:

ders4.js
const garen = { isim: "Garen", hp: 620 }garen.esya = { ad: "Uzun Kılıç" }garen.esya.hasar = 10console.log(garen)
Çıktı
{ isim: 'Garen', hp: 620, esya: { ad: 'Uzun Kılıç', hasar: 10 } }
Sık hata[object Object]: objeyi metinle + ile birleştirmek

Ne zaman çıkar? Bir objeyi + ile bir metne eklemeye çalışınca. Hata mesajı yok, ama çıktı işe yaramaz:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }console.log("Şampiyon: " + ahri)
Çıktı
Şampiyon: [object Object]

Nasıl düzelir? + objeyi metne çevirmek zorunda kalır ve JavaScript'in her obje için ürettiği metin [object Object]'tir. Objenin içini görmek istiyorsan virgül kullan; tek bir alan istiyorsan o alanı yaz:

ders4.js
const ahri = { isim: "Ahri", hp: 100, gold: 300 }console.log("Şampiyon:", ahri)console.log("Şampiyon: " + ahri.isim)
Çıktı
Şampiyon: { isim: 'Ahri', hp: 100, gold: 300 }Şampiyon: Ahri
Sık hataDeğişkendeki anahtarı noktayla okumak: undefined

Ne zaman çıkar? Anahtar bir değişkenin ya da parametrenin içindeyken nokta kullanınca. Hata yok, ama değer hep undefined çıkar:

ders4.js
function degerGoster(sampiyon, alan) {    console.log(alan + ": " + sampiyon.alan)} const ahri = { isim: "Ahri", hp: 100, gold: 300 }degerGoster(ahri, "gold")
Çıktı
gold: undefined

Nasıl düzelir? sampiyon.alan harfi harfine alan adlı alanı arar. Parametrenin içindeki anahtarı kullanmak için köşeli parantez şart: sampiyon[alan]. Düzeltince çıktı gold: 300 olur.

Sık hataSyntaxError: Unexpected identifier 'console'

Ne zaman çıkar? Çok satırlı bir objeyi kapatan }'yi unutunca. Mesajdaki ad, objeden sonraki satır neyle başlıyorsa odur; burada console.

ders4.js
const ahri = {    isim: "Ahri",    hp: 100console.log(ahri)
Hata çıktısı
C:\kod\ogren\ders4.js:4console.log(ahri)^^^^^^^ SyntaxError: Unexpected identifier 'console'    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Nasıl düzelir? JavaScript hp: 100'den sonra virgül ya da } bekliyordu, karşısına console çıktı. Sorun ^'nın gösterdiği satırda değil, bir üstte: obje kapanmamış. Her { için bir } olduğundan emin ol; Ders 2'deki parantez eşleştirme alışkanlığı burada da işe yarar.

Görevler

Her görevi ders4.js dosyasında yap; önceki kodu sil ya da satırların başına // koy. Önce kendin dene, takılırsan ipuçlarını sırayla aç. Çözüme en son bak.

Görev 1

Jinx'in kartı

jinx adında bir obje oluştur. İçinde dört alan olsun: isim için "Jinx", rol için "nişancı", mana için 250, seviye için 1. Önce objenin tamamını yazdır, sonra alanları nokta ile okuyarak ikinci satırı yazdır. Çıktın şöyle olmalı:

Metin
{ isim: 'Jinx', rol: 'nişancı', mana: 250, seviye: 1 }Jinx bir nişancı, seviye 1
İpucu 1

Objenin parçalarını gösteren şekle dön: obje süslü parantezle açılıp kapanır, anahtar ile değerin arasına :, alanların arasına , gelir. Metinler tırnaklı, sayılar tırnaksız.

İpucu 2

const jinx = { isim: "Jinx", … } diye başla. İkinci satır için metinleri ve alanları + ile birleştir: jinx.isim + " bir " + jinx.rol + …. Boşlukları tırnakların içine koymayı unutma.

Çözümü göster
ders4.js
const jinx = { isim: "Jinx", rol: "nişancı", mana: 250, seviye: 1 }console.log(jinx)console.log(jinx.isim + " bir " + jinx.rol + ", seviye " + jinx.seviye)
Çıktı
{ isim: 'Jinx', rol: 'nişancı', mana: 250, seviye: 1 }Jinx bir nişancı, seviye 1

Denetim: ilk satırda 250 ve 1 tırnaksız görünmeli. mana: '250' görüyorsan sayıyı tırnak içinde yazmışsın; tırnakları kaldır.

Görev 2

Seviye atladı

Şu objeyle başla:

JavaScript
const jinx = { isim: "Jinx", seviye: 5, mana: 250, baronGucu: true }

Sırayla şunları yap:

  1. Objeyi yazdır.
  2. Jinx seviye atladı: seviye 1, mana 30 artsın. 6 ve 280'i elle yazmak yok; hesabı JavaScript yapsın.
  3. Ultisi 6. seviyede açıldı: ulti adında yeni bir alan ekle, değeri true olsun.
  4. Baron güçlendirmesinin süresi bitti: baronGucu alanını sil.
  5. Objeyi yeniden yazdır, sonra jinx.baronGucu değerini yazdır.

Çıktı:

Metin
{ isim: 'Jinx', seviye: 5, mana: 250, baronGucu: true }{ isim: 'Jinx', seviye: 6, mana: 280, ulti: true }undefined
İpucu 1

Her adım bu derste gördüğün bir işleme karşılık geliyor: 2. adım alan değiştirmek, 3. adım yeni alan eklemek, 4. adım alan silmek. Bir alanı artırmak, Ders 1'de bir değişkeni artırmakla aynı iştir: önce eski değeri oku, sonucu yine aynı yere koy.

İpucu 2

jinx.seviye = jinx.seviye + 1; mana için de aynısını yaz. Olmayan bir alana değer verince alan eklenir: jinx.ulti = true. Silmek için delete jinx.baronGucu.

Çözümü göster
ders4.js
const jinx = { isim: "Jinx", seviye: 5, mana: 250, baronGucu: true }console.log(jinx)jinx.seviye = jinx.seviye + 1jinx.mana = jinx.mana + 30jinx.ulti = truedelete jinx.baronGucuconsole.log(jinx)console.log(jinx.baronGucu)
Çıktı
{ isim: 'Jinx', seviye: 5, mana: 250, baronGucu: true }{ isim: 'Jinx', seviye: 6, mana: 280, ulti: true }undefined

Son satırdaki undefined, alanın gerçekten silindiğini gösteriyor. jinx const olduğu hâlde hepsini yapabildin, çünkü kutudaki obje hep aynı obje. Deneme: en sona jinx = {} ekle; TypeError: Assignment to constant variable. almalısın.

Görev 3

Hata avı

Teemo'nun bilgisini yazdıran bu programda üç hata var. Gözle aramadan, hata mesajlarını ve çıktıyı okuyarak düzelt: çalıştır, mesajı oku, ilk hatayı düzelt, yeniden çalıştır.

ders4.js✗ Yanlış
const teemo = {    isim: "Teemo"    hp: 80,    mantar = 3}const alan = "mantar"console.log(teemo.isim + " mantar sayısı: " + teemo.alan)
Hata çıktısı
C:\kod\ogren\ders4.js:3    hp: 80,    ^^ SyntaxError: Unexpected identifier 'hp'    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Hepsini düzeltince çıktı Teemo mantar sayısı: 3 olmalı.

İpucu 1

İlk mesaj 3. satırı gösteriyor ama 3. satırda bir sorun bulamayacaksın. Bir üst satırın sonuna bak.

İpucu 2

İkinci mesaj Invalid shorthand property initializer olacak. Objenin içinde anahtar ile değerin arasına hangi işaret gelir?

İpucu 3

Sözdizimi hataları bitince program çalışır ama Teemo mantar sayısı: undefined yazar. Hangi alanın okunacağı alan değişkeninin içinde; nokta bunu göremez.

Çözümü göster
ders4.js
const teemo = {    isim: "Teemo",    hp: 80,    mantar: 3}const alan = "mantar"console.log(teemo.isim + " mantar sayısı: " + teemo[alan])
Çıktı
Teemo mantar sayısı: 3

Sırasıyla gelenler: SyntaxError: Unexpected identifier 'hp' (2. satırın sonunda eksik virgül), SyntaxError: Invalid shorthand property initializer (4. satırda =), sonra hatasız ama yanlış bir çıktı: teemo.alan undefined verdi, doğrusu teemo[alan]. Üçüncü hata hiçbir mesaj vermedi; Ders 2'den tanıdığın bir mantık hatası. Çıktıyı beklenenle karşılaştırmak da hata okumanın bir parçası.

Görev 4

TFT birimi ve eşyası

TFT'de her birimin bir adı ve yıldız sayısı var; birim bir eşya da taşıyabilir. Gerçek oyunda üç eşya taşır, bu görevde en fazla bir. Bir birim objesi alan ve onu yazdıran birimYazdir adında bir fonksiyon yaz:

  • Birimin esya alanı yoksa: Jinx (2 yıldız) - eşya yok
  • Varsa: Jinx (2 yıldız) - eşya: Kılıç (+15 saldırı)

Fonksiyonunu şu satırlarla dene; eşya iki çağrının arasında ekleniyor:

JavaScript
const jinx = { ad: "Jinx", yildiz: 2 }birimYazdir(jinx)jinx.esya = { ad: "Kılıç", saldiri: 15 }birimYazdir(jinx)

Beklenen çıktı:

Metin
Jinx (2 yıldız) - eşya yokJinx (2 yıldız) - eşya: Kılıç (+15 saldırı)
İpucu 1

İlk çağrıda birim.esya yok. Denetlemeden birim.esya.ad okursan ne olur? O hatanın adını bu derste gördün.

İpucu 2

Fonksiyonun içinde if (birim.esya === undefined) { … } else { … } kullan. Eşyanın adı birim.esya.ad, saldırısı birim.esya.saldiri.

Çözümü göster
ders4.js
function birimYazdir(birim) {    const baslik = birim.ad + " (" + birim.yildiz + " yıldız)"    if (birim.esya === undefined) {        console.log(baslik + " - eşya yok")    } else {        const bilgi = birim.esya.ad + " (+" + birim.esya.saldiri + " saldırı)"        console.log(baslik + " - eşya: " + bilgi)    }} const jinx = { ad: "Jinx", yildiz: 2 }birimYazdir(jinx)jinx.esya = { ad: "Kılıç", saldiri: 15 }birimYazdir(jinx)
Çıktı
Jinx (2 yıldız) - eşya yokJinx (2 yıldız) - eşya: Kılıç (+15 saldırı)

Sınır denemesi: saldırısı 0 olan bir eşya tak ({ ad: "Asa", saldiri: 0 }). Program (+0 saldırı) yazmalı, "eşya yok" dememeli; denetlediğin şey eşyanın var olması, sayının büyüklüğü değil. Bir de if denetimini kaldırıp ilk çağrıyı çalıştır: TypeError: Cannot read properties of undefined (reading 'ad') hatasını kendin gör.

Görev 5

Dükkân

Dükkânın fiyat listesi bir obje: anahtarlar eşyaların adı, değerler fiyatları. satinAl(sampiyon, fiyatlar, esyaAdi) adında üç parametreli bir fonksiyon yaz: hangi şampiyonun, hangi fiyat listesinden, hangi eşyayı aldığını parametrelerle alsın. Fonksiyon üç durumu ayırsın:

  • Listede öyle bir eşya yoksa: Dükkânda böyle bir eşya yok: yay
  • Altın yetmiyorsa: Yasuo için altın yetmiyor: iksir
  • Yetiyorsa altını düşsün ve şunu yazsın: Yasuo kalkan aldı, kalan altın: 350

Şu satırlarla dene:

JavaScript
const dukkan = { kalkan: 450, pelerin: 300, iksir: 50, totem: 0 }const yasuo = { isim: "Yasuo", gold: 800 }satinAl(yasuo, dukkan, "kalkan")satinAl(yasuo, dukkan, "pelerin")satinAl(yasuo, dukkan, "iksir")satinAl(yasuo, dukkan, "iksir")satinAl(yasuo, dukkan, "totem")satinAl(yasuo, dukkan, "yay")console.log(yasuo)

Beklenen çıktı:

Metin
Yasuo kalkan aldı, kalan altın: 350Yasuo pelerin aldı, kalan altın: 50Yasuo iksir aldı, kalan altın: 0Yasuo için altın yetmiyor: iksirYasuo totem aldı, kalan altın: 0Dükkânda böyle bir eşya yok: yay{ isim: 'Yasuo', gold: 0 }
İpucu 1

Önce fiyatı bul. Fiyat listesi fiyatlar parametresinde; hangi eşyanın fiyatına bakacağın ise esyaAdi parametresinin içinde. Nokta mı, köşeli parantez mi?

İpucu 2

Fiyatı bir değişkene koy: const fiyat = fiyatlar[esyaAdi]. Dükkânda olmayan bir eşyanın fiyatı ne çıkar?

İpucu 3

Sıra şöyle: if (fiyat === undefined) ise eşya yok; else if (sampiyon.gold < fiyat) ise altın yetmiyor; else ise sampiyon.gold = sampiyon.gold - fiyat ve yazdır. < mi, <= mi? Elinde tam 50 altın varken 50 altınlık iksiri alabilmelisin.

Çözümü göster
ders4.js
function satinAl(sampiyon, fiyatlar, esyaAdi) {    const fiyat = fiyatlar[esyaAdi]    if (fiyat === undefined) {        console.log("Dükkânda böyle bir eşya yok: " + esyaAdi)    } else if (sampiyon.gold < fiyat) {        console.log(sampiyon.isim + " için altın yetmiyor: " + esyaAdi)    } else {        sampiyon.gold = sampiyon.gold - fiyat        console.log(sampiyon.isim + " " + esyaAdi + " aldı, kalan altın: " + sampiyon.gold)    }} const dukkan = { kalkan: 450, pelerin: 300, iksir: 50, totem: 0 }const yasuo = { isim: "Yasuo", gold: 800 }satinAl(yasuo, dukkan, "kalkan")satinAl(yasuo, dukkan, "pelerin")satinAl(yasuo, dukkan, "iksir")satinAl(yasuo, dukkan, "iksir")satinAl(yasuo, dukkan, "totem")satinAl(yasuo, dukkan, "yay")console.log(yasuo)
Çıktı
Yasuo kalkan aldı, kalan altın: 350Yasuo pelerin aldı, kalan altın: 50Yasuo iksir aldı, kalan altın: 0Yasuo için altın yetmiyor: iksirYasuo totem aldı, kalan altın: 0Dükkânda böyle bir eşya yok: yay{ isim: 'Yasuo', gold: 0 }

Sınırlar:

  • Üçüncü çağrı tam sınırda: 50 altınla 50 altınlık iksir. < yerine <= yazsaydın bu çağrı "altın yetmiyor" derdi.
  • totem bedava. Altın 0 iken bile alınabiliyor, çünkü 0 < 0 yanlış. Fiyatın 0 olması eşyanın olmadığı anlamına gelmez; bu yüzden denetim fiyat === undefined ile yapılıyor.
  • fiyatlar.esyaAdi yazsaydın her eşya için "Dükkânda böyle bir eşya yok" çıkardı: nokta, esyaAdi adında bir eşya arar.
  • Fonksiyon yasuo objesini değiştirdi; son satırda altının 0 olduğunu dışarıdan görüyorsun. Ders 3'teki esyaAl kalan altını yalnızca yazdırabiliyordu; burada her çağrı, bir öncekinin bıraktığı altınla başlıyor.
  • Fiyat listesi parametreyle geldiği için aynı fonksiyon başka bir dükkânın listesiyle de çalışır. Fonksiyonun ihtiyaç duyduğu bilgiyi parametreyle vermek, Ders 3'teki öğüdün ta kendisi.

Kendini sına

Soru 1

Bu program ne yazar?

JavaScript
const katarina = { isim: "Katarina", hp: 600 }katarina.hp = katarina.hp - 100katarina.Hp = 50console.log(katarina.hp)console.log(katarina)
Cevabı göster

Önce 500, sonra { isim: 'Katarina', hp: 500, Hp: 50 }. Üçüncü satır hp'yi değiştirmedi; büyük harfli Hp adında yeni bir alan ekledi. Büyük-küçük harf farklıdır.

Soru 2

Üç satır sırayla ne yazar?

JavaScript
const anahtar = "hp"const zed = { isim: "Zed", hp: 580, anahtar: "gizli" }console.log(zed[anahtar])console.log(zed["anahtar"])console.log(zed.anahtar)
Cevabı göster

580, gizli, gizli. zed[anahtar] tırnaksız: anahtar değişkeninin içindeki "hp" kullanılır. zed["anahtar"] ve zed.anahtar ise harfi harfine anahtar adlı alanı okur; bu objede böyle bir alan da var ve değeri "gizli".

Soru 3

Hangi satır hata verir, hangi türde?

JavaScript
const annie = { isim: "Annie", hp: 80 }annie.hp = 50annie.ayi = "Tibbers"delete annie.ayiannie = { isim: "Annie", hp: 80 }
Cevabı göster

Yalnız 5. satır: TypeError: Assignment to constant variable. 2, 3 ve 4. satırlar objenin içini değiştiriyor (alan değiştirmek, eklemek, silmek); bunlar const objede serbest. 5. satır ise annie kutusuna başka bir obje koymaya çalışıyor.

Soru 4

Bir arkadaşının programı şunu yazdırıyor. Hangi değerler metin, hangisi sayı? lux.hp + 10 ne yazar?

Metin
{ isim: 'Lux', hp: '90', seviye: 3 }
Cevabı göster

'Lux' ve '90' tek tırnaklı, yani metin; 3 tırnaksız, yani sayı. lux.hp + 10 ise 9010 yazar: Ders 1'deki gibi, +'nın bir yanında metin varsa toplamaz, yapıştırır. Canı sayı olarak (hp: 90) yazmak gerekirdi.

Soru 5

Bu program ne yazar?

JavaScript
function iyilestir(sampiyon) {    sampiyon.hp = sampiyon.hp + 20} const sona = { isim: "Sona", hp: 40 }iyilestir(sona)iyilestir(sona)console.log(sona.hp)
Cevabı göster

80. Fonksiyon her çağrıda aynı sona objesinin canını 20 artırır: 40, 60, 80. Fonksiyona objenin kopyası değil, kendisi gider.

Soru 6

Mesajı oku: hangi şey undefined, neden?

ders4.js
const ahri = { isim: "Ahri", konum: { x: 120, y: 340 } }console.log(ahri.konm.x)
Hata çıktısı
C:\kod\ogren\ders4.js:2console.log(ahri.konm.x)                      ^ TypeError: Cannot read properties of undefined (reading 'x')    at Object.<anonymous> (C:\kod\ogren\ders4.js:2:23)    ... Node.js v24.20.0
Cevabı göster

Hata x okunurken çıktı; demek ki .x'in solundaki ahri.konm undefined. Sebep bir yazım hatası: anahtar konum, kodda konm yazılmış. Olmayan alan undefined verdi, sonra onun içine bakılmaya çalışıldı. Doğrusu ahri.konum.x.

Soru 7

Bu satır ne yazar? Objenin içini görmek için nasıl düzeltirsin?

JavaScript
const lux = { isim: "Lux", hp: 90 }console.log("Seçilen: " + lux)
Cevabı göster

Seçilen: [object Object] yazar. + objeyi metne çevirir ve her obje [object Object] olur. Virgülle yazdır: console.log("Seçilen:", lux) satırı Seçilen: { isim: 'Lux', hp: 90 } yazar.

Kayıt noktası

Ders 1'de C:\kod\ogren klasöründe git init yaptın; aynı klasörde bir daha gerekmez. Bu dersin dosyasını kaydetmek için iki komut yeter. VS Code terminalinde, C:\kod\ogren klasöründeyken:

Bir sonraki derste bütün takımı tek bir listede tutmayı (dizi) ve her şampiyon için aynı işi tekrar tekrar yaptırmayı (döngü) öğreneceksin.

İşaret yalnızca bu tarayıcıda saklanır, kimseye gönderilmez.