Blok 1 · Ders 5
Dizi ve döngü: bütün takım
Sıralı listeleri dizi olarak tutuyor, for ve while döngüleriyle her eleman için aynı işi yaptırıyorsun.
Bu dersin sonunda
- Bir listeyi dizi olarak yazıp elemanlarını sıra numarasıyla (index) okuyabilir ve değiştirebilirsin
lengthile eleman sayısını ve son elemanı bulabilirsinpush,pop,includesveindexOfile diziye eleman ekleyip çıkarabilir, dizide arama yapabilirsinfor,for...ofvewhiledöngüleriyle aynı işi tekrar tekrar yaptırabilir, sonsuz döngüyü Ctrl+C ile durdurabilirsin- Objelerden oluşan bir takımda canlıları sayabilir, toplam altını ve en yüksek canı bulabilirsin
breakvecontinuekullanabilir, bir fazla / bir eksik tur hatalarını mesajından ya da yanlış çıktıdan tanıyıp düzeltebilirsin
Bu sayfada
- Neden dizi?
- Dizi: sıralı liste
- Sıra numarası: sayım sıfırdan başlar
- Kaç eleman var: length
- Elemanı değiştirmek
- Eklemek ve çıkarmak: push ve pop
- Dizide aramak: includes ve indexOf
- Döngü: aynı işi her eleman için yapmak
- for döngüsü
- for ile diziyi gezmek
- for...of: her eleman için
- while: ne zaman biteceği belli olmayan döngü
- Dizi içinde objeler: takım
- Döngüde koşul: saymak, toplamak, en yükseği bulmak
- break ve continue
- Sık hatalar
- Görevler
- Kendini sına
- Kayıt noktası
Ders 4'te bir şampiyonun bütün bilgisini tek bir objede topladın. Ama LoL tek şampiyonla oynanmaz: takımda beş kişi, bir dalgada altı minyon, dükkânda onlarca eşya var. Bu derste sıralı listeleri dizi olarak tutmayı ve döngü ile aynı işi listedeki her eleman için tekrarlatmayı öğreneceksin. Dersin sonunda beş kişilik bir takımın kaçının ayakta olduğunu, toplam altınını ve en çok canı olanı birkaç satırla bulabileceksin.
Neden dizi?
Takımındaki beş şampiyonu şimdiye kadar öğrendiklerinle tutmak istesen her biri için ayrı bir değişken açardın:
const oyuncu1 = "Ahri"const oyuncu2 = "Garen"const oyuncu3 = "Jinx"const oyuncu4 = "Lux"const oyuncu5 = "Teemo"Beş kişi için idare eder. Ama altıncı biri gelince oyuncu6'yı elle açman, "Takımda Teemo var mı?" sorusu için beş ayrı karşılaştırma yazman gerekir. 50 minyonluk bir dalga için 50 değişken açardın.
Bilgisayarın asıl gücü aynı işi binlerce kez yorulmadan yapabilmesidir. Ama ona "hepsine şunu yap" diyebilmen için hepsinin tek bir yerde, sırayla durması gerekir. Bu yer dizidir.
Dizi: sıralı liste
Dizi, birden çok değeri sırasıyla tutan tek bir kutudur. Köşeli parantez [ ] içine değerleri virgülle ayırarak yazarsın.
Üç kişilik bir takımla başla; ders5.js'e şunu yaz ve çalıştır:
const takim = ["Ahri", "Lux", "Jinx"]console.log(takim)console.log(takim.length)PS C:\kod\ogren> node ders5.js[ 'Ahri', 'Lux', 'Jinx' ]3takim tek bir değişken ama içinde üç metin var. takim.length dizide kaç eleman olduğunu söyler.
Node diziyi yazdırırken metinleri tek tırnakla gösterir. Ders 4'teki objelerde olduğu gibi bu yalnızca gösterme biçimi; sen kodda çift tırnak kullanmaya devam et.
Dizide yalnızca metin değil, her tür değer durabilir. Hiç elemanı olmayan boş dizi de geçerlidir; uzunluğu 0'dır:
const canlar = [100, 85, 0, 40, 60]const kulube = []console.log(canlar)console.log(kulube)console.log(kulube.length)[ 100, 85, 0, 40, 60 ][]0Sıra numarası: sayım sıfırdan başlar
Dizideki her elemanın bir sıra numarası (index) vardır. Ders 4'te objeyi köşeli parantezle okumuştun; dizide parantezin içine anahtar yerine elemanın numarasını yazarsın. Şimdi dikkat: ilk elemanın numarası 0'dır, 1 değil.
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim[0])console.log(takim[1])console.log(takim[4])AhriGarenTeemoNeden sıfır? Sıra numarası aslında elemanın baştan kaç adım uzakta olduğunu söyler. Ahri en baştadır, ona ulaşmak için hiç adım atman gerekmez: 0. Garen bir adım ötededir: 1.
Sıfırdan saymak başta herkesi zorlar; bu dersteki hataların çoğu bu bir adımlık kaymadan çıkıyor.
Olmayan sıra numarası: undefined
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim[5])console.log(takim[-1])undefinedundefined5 numaralı bir yuva yok. Ders 4'te olmayan bir alanı okuduğunda olduğu gibi hata çıkmaz; "böyle bir değer yok" anlamında undefined gelir. Eksi sayılar da sıra numarası değildir; başka bazı dillerde -1 son elemanı verir, JavaScript'te vermez.
Kaç eleman var: length
length (uzunluk) dizideki eleman sayısını verir. Sonunda parantez yoktur: komut değil, dizinin hazır bir alanıdır; Ders 4'teki ahri.hp gibi nokta ile okunur.
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim.length)console.log(takim[takim.length - 1])5TeemoSon eleman
Son console.log satırındaki kalıp her dizide işe yarar: son eleman dizi[dizi.length - 1]. Sayım 0'dan başladığı için son numara her zaman uzunluğun bir eksiğidir: beş elemanlı dizide 4.
Neden doğrudan takim[4] yazmıyoruz? Dizi büyüyüp küçülebilir. Takıma biri katılınca son eleman 5 numaraya geçer ve takim[4] yanlış kişiyi gösterir; takim[takim.length - 1] ise her zaman sonuncuyu.
Köşeli parantezin içine sonucu sayı olan her şeyi yazabilirsin: takim[2 + 1], takim[sira], takim[takim.length - 1]. Döngülerin bütün gücü buradan gelecek.
TypeError: takim.length is not a functionNe zaman çıkar? length'in sonuna parantez koyunca. JavaScript parantezi görünce length'i bir fonksiyon gibi çalıştırmaya kalkar.
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim.length())C:\kod\ogren\ders5.js:2console.log(takim.length()) ^ TypeError: takim.length is not a function at Object.<anonymous> (C:\kod\ogren\ders5.js:2:19) ... Node.js v24.20.0Nasıl düzelir? Mesaj "takim.length bir fonksiyon değil" diyor: length bir sayıdır (burada 5) ve sayı çalıştırılamaz. Parantezleri sil: takim.length.
Elemanı değiştirmek
Bir yuvanın içini değiştirmek için o yuvaya yeni değer koyarsın:
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]takim[1] = "Yasuo"console.log(takim)[ 'Ahri', 'Yasuo', 'Jinx', 'Lux', 'Teemo' ]takim[1] = "Yasuo" satırını Ders 1'deki gibi sağdan sola oku: "Yasuo'yu 1 numaralı yuvaya koy." Garen'in yerini Yasuo aldı; dizinin uzunluğu değişmedi.
Sayılarla da aynı: yuvadaki değeri okur, hesaplar ve sonucu aynı yuvaya geri koyarsın.
const canlar = [100, 85, 40]canlar[2] = canlar[2] - 30console.log(canlar)[ 100, 85, 10 ]Eklemek ve çıkarmak: push ve pop
Takıma biri katıldı ya da ayrıldı. Dizinin sonuna eleman eklemek için push, sonundaki elemanı çıkarmak için pop kullanılır:
const takim = ["Ahri", "Garen", "Jinx"]takim.push("Lux")console.log(takim)takim.pop()takim.pop()console.log(takim)console.log(takim.length)[ 'Ahri', 'Garen', 'Jinx', 'Lux' ][ 'Ahri', 'Garen' ]2takim.push("Lux"): parantezdeki değeri dizinin sonuna ekler. Uzunluk bir artar.takim.pop(): son elemanı çıkarır. Parantezin içi boştur, çünkü hangi elemanın çıkacağı bellidir: sonuncu. İki kez çağırdık; önce Lux, sonra Jinx gitti.
push ve pop dizinin metotlarıdır: dizinin kendisine bağlı, onun üstünde çalışan fonksiyonlar. Ders 3'te fonksiyonları yalnızca adlarıyla çağırıyordun; metotları ise önlerine dizinin adını ve bir nokta koyarak çağırırsın.
pop çıkardığı elemanı çöpe atmaz, sana verir. İstersen onu bir kutuya koyabilirsin:
const takim = ["Ahri", "Garen", "Jinx"]const cikan = takim.pop()console.log(cikan + " takımdan ayrıldı")console.log(takim)Jinx takımdan ayrıldı[ 'Ahri', 'Garen' ]Fonksiyonların nasıl değer geri verdiğini (return) Ders 6'da öğreneceksin. Şimdilik bil ki takim.pop() yazdığın yere çıkan eleman gelir, tıpkı 5 + 3 yazdığın yere 8 gelmesi gibi.
TypeError: takim.Push is not a functionNe zaman çıkar? Metodun adını yanlış yazınca: Push, puhs, Pop. Metot adları da büyük-küçük harfe duyarlıdır.
const takim = ["Ahri"]takim.Push("Lux")C:\kod\ogren\ders5.js:2takim.Push("Lux") ^ TypeError: takim.Push is not a function at Object.<anonymous> (C:\kod\ogren\ders5.js:2:7) ... Node.js v24.20.0Nasıl düzelir? Doğrusu küçük harfle push; Ders 1'deki console.lg hatasının aynısı. VS Code nokta koyduğun anda metotları önerir, listeden seçersen yazım hatası yapmazsın.
Dizide aramak: includes ve indexOf
İki sık soru: "Takımda Lux var mı?" ve "Varsa kaç numaralı yuvada?" İlkini includes (içerir), ikincisini indexOf (sırası) cevaplar.
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim.includes("Lux"))console.log(takim.includes("Zed"))console.log(takim.includes("lux"))console.log(takim.indexOf("Jinx"))console.log(takim.indexOf("Zed"))truefalsefalse2-1includes, Ders 2'den tanıdığın boolean değerlerden birini verir: varsatrue, yoksafalse.- Büyük-küçük harf farklıdır:
"lux"ile"Lux"aynı metin değil, bu yüzden üçüncü satırfalse. indexOfbulduğu elemanın sıra numarasını, bulamazsa-1verir. Hiçbir eleman -1 numarada durmadığı için -1 "yok" demektir.
includes'un verdiği true ya da false'u doğrudan if'in koşuluna koyabilirsin:
const takim = ["Ahri", "Garen", "Jinx", "Lux"]const secilen = "Jinx"if (takim.includes(secilen)) { console.log(secilen + " zaten takımda, başka şampiyon seç")} else { takim.push(secilen) console.log(secilen + " takıma katıldı")}Jinx zaten takımda, başka şampiyon seçsecilen'i "Teemo" yapıp yeniden çalıştır: bu kez else bloğu çalışır ve Teemo takıma katıldı yazar. İki bloğu da denemek, Ders 2'deki "çalışıyor ile doğru aynı şey değil" alışkanlığının parçası.
indexOf kullanırken -1 durumunu ayrıca kontrol et:
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]const sira = takim.indexOf("Teemo")if (sira === -1) { console.log("Teemo takımda yok")} else { console.log("Teemo " + sira + " numaralı yuvada")}Teemo 4 numaralı yuvadaDört metodun kısa özeti:
| Metot | Ne yapar? | takim = ["Ahri", "Lux"] iken |
|---|---|---|
push(x) | x'i sona ekler | takim.push("Jinx") → takım [ 'Ahri', 'Lux', 'Jinx' ] olur |
pop() | Sondakini çıkarır ve verir | takim.pop() → "Lux" çıkar, takım [ 'Ahri' ] kalır |
includes(x) | x var mı? | takim.includes("Lux") → true |
indexOf(x) | x kaç numaralı yuvada? | takim.indexOf("Lux") → 1, yoksa -1 |
Döngü: aynı işi her eleman için yapmak
Takımdaki herkesi "savaşa hazır" diye yazdırmak istiyorsun. Şimdiye kadarki bilginle:
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim[0] + " savaşa hazır")console.log(takim[1] + " savaşa hazır")console.log(takim[2] + " savaşa hazır")console.log(takim[3] + " savaşa hazır")console.log(takim[4] + " savaşa hazır")Ahri savaşa hazırGaren savaşa hazırJinx savaşa hazırLux savaşa hazırTeemo savaşa hazırÇalışıyor ama beş satırın tek farkı köşeli parantezdeki sayı. Takım 50 kişi olsa 50 satır yazardın; takıma biri katılınca kodu da değiştirmen gerekirdi. İstediğimiz şu: "0'dan başla, her seferinde bir artır, dizinin sonuna gelince dur; her adımda bu satırı çalıştır." Bunun adı döngü.
for döngüsü
JavaScript'te en çok kullanılan döngü for'dur. Önce dizisiz, yalın bir örnek. Parantezin içine bu kursta ilk kez noktalı virgül (;) yazacaksın: Türkçe Q klavyede Shift+, (İ'nin sağındaki tuş).
for (let i = 0; i < 3; i++) { console.log("Tur " + i)}Tur 0Tur 1Tur 2Süslü parantezin içindeki satır üç kez çalıştı ve her seferinde i bir fazlaydı. for'un parantezinde noktalı virgülle ayrılmış üç parça var; süslü parantezin içi de döngünün gövdesi:
for satırının parçaları. Parantezdeki üç parça döngüyü yönetir, süslü parantezin içi her turda çalışır.- Başlangıç
let i = 0: döngü başlarken bir kez çalışır;iadında bir sayaç kutusu açar. - Koşul
i < 3: her turdan önce sorulur.trueise gövde çalışır,falseise döngü biter ve program}'nin altından devam eder. - Artış
i++: her turun sonunda sayacı bir artırır.
i++: bir artır
let kill = 0kill++kill++console.log(kill)kill--console.log(kill)21kill++, kill = kill + 1 yazmanın kısa yoludur: "kutudaki değeri bir artır." kill-- da bir azaltır. Döngülerde sayaç hemen her zaman i++ ile artırılır.
Neden i? Çoğunlukla İngilizce index sözcüğünün baş harfi diye açıklanır; dünyanın her yerinde döngü sayacına böyle ad verilir. İstersen tur ya da sira gibi daha anlamlı bir ad da verebilirsin.
Turları adım adım izlemek
for döngüsünün çalışma sırası şöyle: başlangıç bir kez, sonra koşul, gövde, artış; yeniden koşul, gövde, artış… Koşul false olana kadar bu çember döner.
for döngüsünün akışı. Koşul her turdan önce sorulur; cevap false olunca döngüden çıkılır.Aynı şeyi bir tabloyla izleyelim. Döngü hatalarını bulmanın en sağlam yolu, böyle bir tabloyu kâğıda çizmektir:
| Adım | i | i < 3 | Ne olur? |
|---|---|---|---|
| 1 | 0 | true | Tur 0 yazılır, sonra i++ ile i 1 olur |
| 2 | 1 | true | Tur 1 yazılır, i 2 olur |
| 3 | 2 | true | Tur 2 yazılır, i 3 olur |
| 4 | 3 | false | Döngü biter, }'nin altındaki satıra geçilir |
Koşula dört kez bakıldı ama gövde üç kez çalıştı: son bakışta i 3'tü ve cevap false çıktı.
Sayacı 1'den başlatmak
for (let tur = 1; tur <= 3; tur++) { console.log(tur + ". tur başladı")}1. tur başladı2. tur başladı3. tur başladıBu kez sayaç tur 1'den başlıyor ve koşulda <= var: "1'den 3'e kadar, 3 dahil." İnsan gibi sayarken bu biçim doğal gelir; dizilerde ise sayacı 0'dan başlatıp < kullanacaksın.
SyntaxError: Identifier 'i' has already been declared (for'da virgül)Ne zaman çıkar? for'un parantezindeki parçaları noktalı virgül yerine virgülle ayırınca.
for (let i = 0, i < 3, i++) { console.log("Tur " + i)}C:\kod\ogren\ders5.js:1for (let i = 0, i < 3, i++) { ^ SyntaxError: Identifier 'i' has already been declared at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Mesaj yanıltıcı: i'yi iki kez tanımlamadın. JavaScript let i = 0, yazısını "virgülden sonra bir kutu daha açılacak" diye okudu ve ikinci i'yi yeni bir kutu sandı. Yalnızca ikinci virgül yanlışsa (i < 3, i++) mesaj SyntaxError: Unexpected token ')' olur.
Nasıl düzelir? Parantezde iki noktalı virgül olmalı: for (let i = 0; i < 3; i++). Mesaj tuhaf geldiğinde önce ^ işaretinin gösterdiği yere bak.
for ile diziyi gezmek
Şimdi döngüyü diziyle birleştir. Sayaç sıra numarası olarak kullanılır:
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]for (let i = 0; i < takim.length; i++) { console.log((i + 1) + ". oyuncu: " + takim[i])}1. oyuncu: Ahri2. oyuncu: Garen3. oyuncu: Jinx4. oyuncu: Lux5. oyuncu: TeemoHer turda i bir sıra numarasıdır: 0, 1, 2, 3, 4. takim[i] de o turda o numaradaki elemandır. Koşul i < takim.length, yani i < 5: i 5 olunca döngü durur, çünkü 5 numaralı yuva yok. Takıma biri katılırsa döngüye dokunman gerekmez; takim.length 6 olur ve döngü kendiliğinden 6 tur döner.
İnsanlar için 1'den saymak istediğimizden ekrana i + 1 yazdırdık: diziden okurken takim[i], ekranda gösterirken i + 1.
for...of: her eleman için
Çoğu zaman sıra numarasına ihtiyacın olmaz, yalnızca elemanların kendisi gerekir. O zaman daha kısa bir yazım var:
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]for (const sampiyon of takim) { console.log(sampiyon + " savaşa hazır")}Ahri savaşa hazırGaren savaşa hazırJinx savaşa hazırLux savaşa hazırTeemo savaşa hazırŞöyle oku: "takim'daki her sampiyon için." JavaScript her turda sıradaki elemanı sampiyon kutusuna koyar ve gövdeyi çalıştırır. Sayaç, koşul ve takim[i] yok; bir eksik ya da bir fazla tur hatası yapma şansın da yok.
Kutuya tekil bir ad ver: takim için sampiyon, esyalar için esya. Sayaçlı for'a bundan sonra, ayırt etmek için klasik for diyeceğiz.
sampiyon her turda yeniden açılan bir kutu olduğu için const yazabildik. Klasik for'daki i ise her turun sonunda değiştirildiği için orada let şart.
TypeError: Assignment to constant variable. (for'da const)Ne zaman çıkar? "Önce const yaz" alışkanlığıyla klasik for'un sayacını const ile açınca.
for (const i = 0; i < 3; i++) { console.log("Tur " + i)}Tur 0C:\kod\ogren\ders5.js:1for (const i = 0; i < 3; i++) { ^ TypeError: Assignment to constant variable. at Object.<anonymous> (C:\kod\ogren\ders5.js:1:27) ... Node.js v24.20.0İlk tur çalıştı (Tur 0). Turun sonunda i++ mühürlü kutuyu değiştirmeye kalkınca program durdu; ^ tam i++'nın altında.
Nasıl düzelir? Klasik for'da sayaç her zaman let: for (let i = 0; ...). for...of'ta ise const doğru, çünkü orada kutu her turda yeniden açılır.
of yerine in)Ne zaman çıkar? for...of yazarken of yerine in yazınca. Hata mesajı yok, ama elemanlar yerine sıra numaraları gelir.
const takim = ["Ahri", "Garen", "Jinx"]for (const sampiyon in takim) { console.log(sampiyon)}012Nasıl düzelir? in'i of yap. for...in başka bir iş içindir; bu kursta diziyi hep of ile geziyoruz.
Dizinin yuvalarını değiştirmek
for...of'un verdiği kutuya yeni değer koymak dizinin yuvasını değiştirmez. can kutusu her turda dizideki değeri kendine alan ayrı bir kutudur (ona yeni değer koyacağımız için burada let yazdık):
const canlar = [100, 85, 40]for (let can of canlar) { can = can + 50}console.log(canlar)[ 100, 85, 40 ]Dizi hiç değişmedi. Yuvaları değiştirmek için sıra numarasıyla yazarsın; yani klasik for:
const canlar = [100, 85, 40]for (let i = 0; i < canlar.length; i++) { canlar[i] = canlar[i] + 50}console.log(canlar)[ 150, 135, 90 ]while: ne zaman biteceği belli olmayan döngü
for, tur sayısı belli olan işler için rahattır: dizinin her elemanı, 3 tur. Ama bazen tur sayısını önceden bilemezsin: "Baron ölene kadar vur." Bunun için while (-dığı sürece) var:
let baronHp = 100let vurus = 0while (baronHp > 0) { baronHp = baronHp - 30 vurus++ console.log(vurus + ". vuruş, Baron'un canı: " + baronHp)}console.log("Baron " + vurus + " vuruşta düştü")1. vuruş, Baron'un canı: 702. vuruş, Baron'un canı: 403. vuruş, Baron'un canı: 104. vuruş, Baron'un canı: -20Baron 4 vuruşta düştüwhile (koşul) { ... } "koşul doğru olduğu sürece gövdeyi tekrarla" demektir. Koşula her turdan önce bakılır, tıpkı for'daki gibi. while'da başlangıç ve artış parçaları yoktur: sayacı döngüden önce sen açarsın (let vurus = 0), koşulu değiştiren satırı da gövdeye sen yazarsın (baronHp = baronHp - 30).
Son vuruştaki -20'ye dikkat et: gerçek oyunda can 0'ın altına inmez. Gövdeye bir if ekleyip canı 0'a sabitleyebilirsin; Görev 2'de benzerini yapacaksın.
Koşul en baştan yanlışsa gövde hiç çalışmaz: ilk satırı let baronHp = 0 yapıp çalıştır, ekrana yalnızca Baron 0 vuruşta düştü gelir.
Hangi döngüyü ne zaman seçeceğin:
| Durum | Hangisi? |
|---|---|
| Dizinin her elemanına sırayla bakmak yeterli | for...of |
| Sıra numarası da gerekiyor ("3. oyuncu", "Teemo 4 numarada") | for |
Dizinin yuvalarını değiştireceksin (canlar[i] = ...) | for |
| Diziyle ilgisi olmayan sayım (3 tur, 10 dalga) | for |
| Kaç tur süreceği belli değil ("Baron ölene kadar") | while |
Sonsuz döngü ve Ctrl+C
while'ın koşulu hiç false olmazsa ne olur? Baron'a vurduğunu yazıp canını azaltmayı unut:
let baronHp = 100while (baronHp > 0) { console.log("Baron'a vurdun!")}PS C:\kod\ogren> node ders5.jsBaron'a vurdun!Baron'a vurdun!Baron'a vurdun!Baron'a vurdun!Baron'a vurdun!Baron'a vurdun!# … durmadan akar. Ctrl+C'ye bas:PS C:\kod\ogren> baronHp hiç değişmiyor, baronHp > 0 hep true: döngü kendiliğinden hiç bitmez. Ctrl+C'den sonra istem geri gelir.
Sonsuz döngü bilgisayarına zarar vermez (en fazla fan sesi artar), ama kendiliğinden de bitmez; durdurmak senin işin:
- Terminal panelinin içine bir kez tıkla; klavyeden yazdıkların terminale gitsin.
- Ctrl+C'ye bas. Node programı hemen durdurur; ekranda bir an daha yazı akabilir, ardından
PS C:\kod\ogren>istemi geri gelir. - Durmazsa bir kez daha bas. Yine durmazsa terminal panelinin sağ üstündeki çöp kutusu simgesine (Kill Terminal) tıkla, sonra Terminal → New Terminal ile yeni bir terminal aç.
- Koddaki hatayı düzelt (burada gövdeye
baronHp = baronHp - 30satırını ekle), kaydet ve yeniden çalıştır.
Sonsuz döngünün üç sık sebebi:
- Koşuldaki değeri değiştirmeyi unutmak. Yukarıdaki örnekte
baronHphiç azalmıyor. - Yanlış yöne saymak.
for (let i = 0; i < 3; i--)sayacı 0, -1, -2 diye azaltır;i < 3hep doğru kalır ve döngü hiç bitmez. - Hiç yanlış olamayacak bir koşul.
while (true)bilerek kurulan sonsuz döngüdür; gövdesinde mutlaka bir çıkış olmalı. Bunu birazdanbreakile göreceksin.
Ne zaman çıkar? Döngünün koşulu hiç false olmayınca: değer gövdede değişmiyorsa, sayaç ters yöne gidiyorsa (i--) ya da while (true) içinde break yoksa. Hata mesajı yoktur; aynı satırlar durmadan akar ya da program hiçbir şey yazmadan bekler.
Nasıl düzelir? Terminale tıkla, Ctrl+C ile durdur. Sonra sor: "Bu koşulu false yapacak satır gövdede var mı?" Yoksa ekle (baronHp = baronHp - 30, i++).
Dizi içinde objeler: takım
Şimdiye kadar takımda yalnızca isimler vardı. Gerçek bir takımda her şampiyonun canı, altını, seviyesi vardır; Ders 4'ten bildiğin gibi bunları bir objede toplarsın. Dizinin elemanları obje de olabilir:
const takim = [ { isim: "Ahri", hp: 100, gold: 300 }, { isim: "Garen", hp: 0, gold: 150 }, { isim: "Jinx", hp: 120, gold: 520 }, { isim: "Lux", hp: 0, gold: 80 }, { isim: "Teemo", hp: 70, gold: 210 }]console.log(takim[2])console.log(takim[2].isim + " canı: " + takim[2].hp)console.log(takim.length){ isim: 'Jinx', hp: 120, gold: 520 }Jinx canı: 1205Okunsun diye her objeyi ayrı satıra yazdık; JavaScript için fark etmez. Objelerin arasında virgül var, sonuncusundan sonra yok. takim.length 5'tir: objeler sayılır, içlerindeki alanlar değil.
takim[2].hp'yi soldan sağa oku: takim dizisinin 2 numaralı yuvasındaki objenin hp alanı. Önce yuvayı seçer, sonra o kartın alanını okursun:
takim[2].hp: önce [2] ile 2 numaralı yuvadaki obje seçilir, sonra .hp ile o objenin alanı okunur.Bu takımı break ve continue bölümünün sonuna kadar kullanacağız. Diziyi yazdığın ilk yedi satırı dosyanın başında bırak, altındaki üç console.log satırını sil. Bundan sonraki örneklerde yalnızca dizinin altına yazacağın satırları gösteriyoruz; satır numaraları bu yüzden 8'den başlıyor. Her yeni örnekte bir öncekinin satırlarını silip yenisini yaz. Numarası 1'den başlayan örnekler (hata kartları gibi) ise kendi dizisini kuran ayrı programlardır.
Bütün takımı tek seferde yazdırırsan Node objeleri alt alta dizer:
console.log(takim)[ { isim: 'Ahri', hp: 100, gold: 300 }, { isim: 'Garen', hp: 0, gold: 150 }, { isim: 'Jinx', hp: 120, gold: 520 }, { isim: 'Lux', hp: 0, gold: 80 }, { isim: 'Teemo', hp: 70, gold: 210 }]for...of ile gezince her turda sampiyon kutusuna bir obje gelir; alanlarını Ders 4'teki gibi nokta ile okursun:
for (const sampiyon of takim) { console.log(sampiyon.isim + ": " + sampiyon.hp + " can")}Ahri: 100 canGaren: 0 canJinx: 120 canLux: 0 canTeemo: 70 cancanlar örneğinde for...of kutusuna yeni değer koymanın diziyi değiştirmediğini görmüştün. Objelerde durum farklı. Takımın maça mavi taraftan başladığını her şampiyonun kartına yaz:
for (const sampiyon of takim) { sampiyon.taraf = "mavi"}console.log(takim[0]){ isim: 'Ahri', hp: 100, gold: 300, taraf: 'mavi' }Dizideki obje değişti. Bu kez kutuya yeni bir değer koymadın, kutudaki objenin içini değiştirdin. sampiyon kutusundaki obje, dizideki objenin kopyası değil, kendisidir; Ders 4'te fonksiyona verilen obje gibi. Var olan bir alan da böyle değişir: döngüde sampiyon.hp = sampiyon.hp + 50 yazsaydın dizideki bütün canlar artardı.
SyntaxError: Unexpected token '{' (objeler arasında virgül yok)Ne zaman çıkar? Dizideki iki objenin arasına virgül koymayı unutunca. Ders 4'teki "virgül unutmak" hatasının dizideki hâli.
const takim = [ { isim: "Ahri", hp: 100 } { isim: "Garen", hp: 0 }]C:\kod\ogren\ders5.js:3 { isim: "Garen", hp: 0 } ^ SyntaxError: Unexpected token '{' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Nasıl düzelir? ^ ikinci objenin başındaki {'yi gösteriyor: JavaScript önceki satırın sonunda virgül ya da ] bekliyordu. 2. satırın sonuna virgül ekle. Bu hata, virgülün eksik olduğu satırın bir altında gösterilir.
Bir de takımda Ahri olup olmadığını includes ile sormayı dene:
console.log(takim.includes("Ahri"))falseDöngüde koşul: saymak, toplamak, en yükseği bulmak
Döngünün gövdesine Ders 2'den beri bildiğin if'i koyunca asıl güç ortaya çıkar. Oyunlarda en çok sorulan üç soru: kaç kişi ayakta, toplam ne kadar, en iyisi kim? Üçünün de cevabı aynı iskeletle yazılır: döngüden önce bir kutu aç, döngünün içinde güncelle, döngüden sonra yazdır.
Saymak: kaç kişi ayakta?
let canliSayisi = 0for (const sampiyon of takim) { if (sampiyon.hp > 0) { canliSayisi++ }}console.log("Ayakta kalan: " + canliSayisi)Ayakta kalan: 3Sayaç döngüden önce 0'dan başlar. Canı 0'dan büyük her şampiyonda bir artar: Ahri, Jinx, Teemo. Döngü bitince içinde 3 vardır.
Toplamak: takımın toplam altını
let toplamAltin = 0for (const sampiyon of takim) { toplamAltin = toplamAltin + sampiyon.gold}console.log("Takımın toplam altını: " + toplamAltin)Takımın toplam altını: 1260Aynı iskelet; bu kez bir artırmak yerine her şampiyonun altınını ekliyoruz. Başlangıç değeri 0 olmalı: döngüden önce henüz kimsenin altını eklenmedi. 100'le başlatsaydın sonuç 100 fazla çıkardı. Sonucu bir kez elle kontrol et: 300, 150, 520, 80 ve 210'un toplamı gerçekten 1260 mı?
En yükseği bulmak: en çok canı olan kim?
let enYuksek = takim[0]for (const sampiyon of takim) { if (sampiyon.hp > enYuksek.hp) { enYuksek = sampiyon }}console.log("En çok canı olan: " + enYuksek.isim + " (" + enYuksek.hp + ")")En çok canı olan: Jinx (120)Turları tabloyla izle:
| Tur | Sıradaki | Kemer kimde? | Sonuç |
|---|---|---|---|
| 1 | Ahri (100) | Ahri (100) | Büyük değil, kemer Ahri'de kalır |
| 2 | Garen (0) | Ahri (100) | Kemer Ahri'de kalır |
| 3 | Jinx (120) | Ahri (100) | 120 daha büyük, kemer Jinx'e geçer |
| 4 | Lux (0) | Jinx (120) | Kemer Jinx'te kalır |
| 5 | Teemo (70) | Jinx (120) | Kemer Jinx'te kalır |
enYuksek bir sayı değil, bütün bir obje. Bu sayede sonunda hem ismini hem canını yazdırabildik.
break ve continue
Bazen bütün diziyi gezmen gerekmez. Aradığını bulduysan devam etmek boşa iştir: break döngüyü o anda bitirir. Takımda düşmüş biri var mı? Bunu öğrenmek için bir tane bulman yeter:
for (const sampiyon of takim) { console.log(sampiyon.isim + " kontrol ediliyor") if (sampiyon.hp === 0) { console.log("Düşen var: " + sampiyon.isim) break }}console.log("Arama bitti")Ahri kontrol ediliyorGaren kontrol ediliyorDüşen var: GarenArama bittiJinx'e, Lux'a ve Teemo'ya hiç bakılmadı. break yalnızca döngüden çıkar, programı bitirmez: program }'nin altındaki satırdan devam eder, bu yüzden Arama bitti yazıldı. İsimle aramak da aynı kalıptır: koşulu sampiyon.isim === "Lux" yaparsın.
continue ise döngüyü bitirmez, yalnızca o turun geri kalanını atlar ve sıradaki tura geçer. Ölüler saldıramaz:
for (const sampiyon of takim) { if (sampiyon.hp === 0) { continue } console.log(sampiyon.isim + " saldırıyor")}Ahri saldırıyorJinx saldırıyorTeemo saldırıyorGaren'in ve Lux'un turunda continue çalıştı; console.log satırına gelinmeden sıradaki şampiyona geçildi.
continue yalnızca o turu atlar, döngü sona kadar sürer. break döngüyü bitirir, kalanlara hiç bakılmaz.Sık hatalar
Döngü hatalarının çoğu sıra numarasının bir adım kaymasından çıkar; bunlara "bir eksik / bir fazla" (İngilizcesi off-by-one) hatası denir. Birçoğu mesaj bile vermez: Ders 2'deki gibi bir mantık hatasıdır, program çalışır ama sonuç yanlıştır. Kartlardaki örnekleri denemek istersen ders5.js'teki eski kodu (takım dizisi dahil) sil ya da başlarına // koy. Bir hata aldığında buraya ya da bütün derslerin hatalarının toplandığı hata rehberine bak.
undefined çıkıyor (<= ile bir fazla tur)Ne zaman çıkar? Diziyi gezerken koşula i < takim.length yerine i <= takim.length yazınca.
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 0; i <= takim.length; i++) { console.log(takim[i] + " savaşa hazır")}Ahri savaşa hazırGaren savaşa hazırJinx savaşa hazırundefined savaşa hazırÜç elemanlı dizide numaralar 0, 1, 2. <= yüzünden i 3 iken de bir tur daha döndü ve olmayan takim[3] okundu.
Nasıl düzelir? Sayaç 0'dan başlıyorsa koşul < olmalı: i < takim.length. Kural: 0'dan başla, < ile bitir.
TypeError: Cannot read properties of undefined (reading 'isim') (döngüde bir fazla tur)Ne zaman çıkar? Olmayan bir yuvadaki objenin alanını okuyunca. En sık sebebi bir önceki karttaki <=: fazladan dönen son turda takim[i] undefined'dır ve undefined'ın alanı okunamaz. Ders 4'te tanıştığın hatanın dizideki hâli.
const takim = [ { isim: "Ahri", hp: 100 }, { isim: "Garen", hp: 0 }, { isim: "Jinx", hp: 120 }]for (let i = 0; i <= takim.length; i++) { console.log(takim[i].isim + ": " + takim[i].hp)}Ahri: 100Garen: 0Jinx: 120C:\kod\ogren\ders5.js:7 console.log(takim[i].isim + ": " + takim[i].hp) ^ TypeError: Cannot read properties of undefined (reading 'isim') at Object.<anonymous> (C:\kod\ogren\ders5.js:7:26) ... Node.js v24.20.0Üç tur sorunsuz geçti; dördüncü turda takim[3] undefined çıktı ve program durdu. Mesajın sonundaki (reading 'isim') okunmaya çalışılan alanı söyler.
Nasıl düzelir? Koşulu < yap. takim[5].isim gibi sabit bir numarayla da aynı hatayı alırsın; o zaman numaranın takim.length - 1'den büyük olmadığından emin ol.
Ne zaman çıkar? "Son numara length - 1" kuralını koşula taşıyınca: i < takim.length - 1. Hata mesajı yok, yalnızca eksik sonuç var.
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 0; i < takim.length - 1; i++) { console.log(takim[i] + " savaşa hazır")}Ahri savaşa hazırGaren savaşa hazırNasıl düzelir? length - 1 son elemanın numarasıdır, koşulun sınırı değil. Koşulu i < takim.length yap: "numara uzunluktan küçük olduğu sürece."
Ne zaman çıkar? İnsanlar gibi 1'den saymaya alışık olduğun için sayacı let i = 1 ile başlatınca.
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 1; i < takim.length; i++) { console.log(takim[i] + " savaşa hazır")}Garen savaşa hazırJinx savaşa hazırAhri yok, hata mesajı da yok. Üç kişilik takımda fark edersin; büyük bir dizide hiç fark etmeyebilirsin.
Nasıl düzelir? Sayacı let i = 0 ile başlat. Ekranda 1'den saymak istiyorsan sayacı değil, yazdırdığın değeri değiştir: (i + 1) + ". oyuncu". Sıra numarası gerekmiyorsa for...of kullan.
lenght yazım hatası)Ne zaman çıkar? length'i lenght diye yanlış yazınca. Hata mesajı çıkmaz; döngü sessizce hiç çalışmaz.
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 0; i < takim.lenght; i++) { console.log(takim[i] + " savaşa hazır")}console.log("Döngü bitti")Döngü bittiDizide lenght diye bir alan yok; olmayan alan undefined verir. 0 < undefined karşılaştırması false çıkar, bu yüzden ilk turdan önce döngü biter.
Nasıl düzelir? Doğrusu length: önce t, sonra h. Döngü hiç dönmüyorsa koşuldaki değeri yazdır: console.log(takim.lenght) undefined gösterir ve hatayı hemen görürsün.
for'da let'i unutmak: hata yok ama i sızıyorNe zaman çıkar? Sayacı let olmadan yazınca: for (i = 0; ...). Şu an yazdığın dosyalarda JavaScript bunu hata saymaz; i adlı kutuyu kendisi, bütün dosyanın görebileceği biçimde açar.
for (i = 0; i < 3; i++) { console.log("Tur " + i)}console.log("Döngüden sonra i: " + i)Tur 0Tur 1Tur 2Döngüden sonra i: 3let ile yazsaydın son satır ReferenceError: i is not defined verirdi: let i yalnızca döngünün içinde yaşar, tıpkı Ders 3'te fonksiyonun içinde açılan kutu gibi (ayrıntısı Ders 10'da). let'siz i ise bütün dosyada ortaktır; iki döngü aynı i'yi kullanınca birbirini bozar:
function minyonCikar() { for (i = 0; i < 2; i++) { console.log(" minyon çıktı") }}for (i = 0; i < 3; i++) { console.log((i + 1) + ". dalga") minyonCikar()}1. dalga minyon çıktı minyon çıktıÜç dalga bekliyordun, bir tane geldi. minyonCikar içindeki döngü ortak i'yi 2'ye getirdi; dıştaki döngü turun sonunda onu 3'e artırdı ve 3 < 3 yanlış olunca bitti. Hata mesajı yok: tam bir mantık hatası.
Nasıl düzelir? Her for'da sayacı let ile aç: for (let i = 0; ...). İki döngüye de let eklersen üç dalga gelir, her birinde iki minyon çıkar.
Görevler
Her görevi ders5.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.
Eşya çantası
Çantanda üç eşya var: Doran Kılıcı, İksir ve Totem. Şunları sırayla yap:
- Bu üç eşyayla
cantaadında bir dizi oluştur. - İksir'in yerine sıra numarasıyla
"Mana İksiri"koy. - Çantaya
"Botlar"ekle. - Eşya sayısını, ilk ve son eşyayı yazdır. Son eşya için
canta[3]yazmak yok; dizi büyüse de çalışacak bir yol kullan. - Totem'in kaç numaralı yuvada olduğunu
indexOfile bul ve yazdır. - Son eşyayı çıkar; yeni son eşyayı ve en sonda bütün çantayı yazdır.
Çıktın tam olarak şöyle olmalı:
Çantada 4 eşya varİlk eşya: Doran KılıcıSon eşya: BotlarTotem 2 numaralı yuvadaSon eşya: Totem[ 'Doran Kılıcı', 'Mana İksiri', 'Totem' ]İpucu 1
İksir 1 numaralı yuvada, çünkü sayım 0'dan başlıyor. Değiştirmek için canta[1] = ..., eklemek için push, çıkarmak için pop.
İpucu 2
Son eşya her zaman canta[canta.length - 1]. pop'tan sonra aynı satırı bir kez daha yazman yeter; length kendiliğinden bir azalır.
Çözümü göster
const canta = ["Doran Kılıcı", "İksir", "Totem"]canta[1] = "Mana İksiri"canta.push("Botlar")console.log("Çantada " + canta.length + " eşya var")console.log("İlk eşya: " + canta[0])console.log("Son eşya: " + canta[canta.length - 1])console.log("Totem " + canta.indexOf("Totem") + " numaralı yuvada")canta.pop()console.log("Son eşya: " + canta[canta.length - 1])console.log(canta)Çantada 4 eşya varİlk eşya: Doran KılıcıSon eşya: BotlarTotem 2 numaralı yuvadaSon eşya: Totem[ 'Doran Kılıcı', 'Mana İksiri', 'Totem' ]Sınır denemesi: pop'u çanta boşalana kadar çağır. Boş çantada canta[canta.length - 1], yani canta[-1], undefined verir ve ekrana Son eşya: undefined gelir. Gerçek bir oyunda önce canta.length === 0 diye bakar, "Çanta boş" yazardın.
Mana dolumu
Mana 0'dan başlıyor ve her tur 35 artıyor. while ile mana 200'e ulaşana kadar her turu yazdır. Mana 200'ü geçemez: son turda 210 değil, 200 yazmalı. En sonda kaç turda dolduğunu yazdır:
1. tur: mana 352. tur: mana 703. tur: mana 1054. tur: mana 1405. tur: mana 1756. tur: mana 200Mana 6 turda dolduİpucu 1
İki kutu gerekiyor: mana ve tur sayacı tur. İkisi de let, ikisi de 0'dan başlıyor. Koşul: mana 200'den küçük olduğu sürece.
İpucu 2
Gövdede sırayla: turu bir artır, manaya 35 ekle, mana 200'ü geçtiyse bir if ile onu 200'e indir, satırı yazdır.
Çözümü göster
let mana = 0let tur = 0while (mana < 200) { tur++ mana = mana + 35 if (mana > 200) { mana = 200 } console.log(tur + ". tur: mana " + mana)}console.log("Mana " + tur + " turda doldu")1. tur: mana 352. tur: mana 703. tur: mana 1054. tur: mana 1405. tur: mana 1756. tur: mana 200Mana 6 turda dolduSınır denemesi: mana'yı 200'den başlat; döngü hiç dönmez ve yalnızca Mana 0 turda doldu yazar. 165'ten başlatırsan tek turda tam 200 olur; 199'dan başlatırsan 234'e çıkar ama if onu 200'e indirir.
Ultisi açık olanlar
Takımdaki şampiyonların seviyeleri şöyle:
const takim = [ { isim: "Annie", seviye: 7 }, { isim: "Yasuo", seviye: 5 }, { isim: "Lux", seviye: 6 }, { isim: "Garen", seviye: 4 }, { isim: "Jinx", seviye: 9 }]LoL'de çoğu şampiyonun ultisi 6. seviyede açılır. Şampiyonları sırayla numaralandırarak her birinin ultisinin açık olup olmadığını yazdır. Sonra kaç kişinin ultisinin açık olduğunu, takımın toplam seviyesini ve en yüksek seviyedeki şampiyonu yazdır:
1. Annie: seviye 7, ulti açık2. Yasuo: seviye 5, ulti kapalı3. Lux: seviye 6, ulti açık4. Garen: seviye 4, ulti kapalı5. Jinx: seviye 9, ulti açıkUltisi açık olan: 3Toplam seviye: 31En yüksek seviye: Jinx (9)İpucu 1
Satırların başındaki numara için sıra numarası gerekiyor, bu yüzden klasik for: for (let i = 0; i < takim.length; i++). O turdaki şampiyon takim[i], seviyesi takim[i].seviye. Ultinin açık olması için seviye 6 ya da daha fazla olmalı: hangi karşılaştırma işareti?
İpucu 2
Ekrandaki numara i + 1; alışkanlık olarak parantez içine al: (i + 1) + ". ". Sayaç ve toplam için döngüden önce iki kutu aç: let ultiAcik = 0 ve let toplamSeviye = 0. Toplamı her turda toplamSeviye = toplamSeviye + takim[i].seviye ile büyüt.
İpucu 3
En yüksek seviye için döngüden önce let enYuksek = takim[0]; her turda takim[i].seviye > enYuksek.seviye ise kemer ona geçer: enYuksek = takim[i].
Çözümü göster
const takim = [ { isim: "Annie", seviye: 7 }, { isim: "Yasuo", seviye: 5 }, { isim: "Lux", seviye: 6 }, { isim: "Garen", seviye: 4 }, { isim: "Jinx", seviye: 9 }]let ultiAcik = 0let toplamSeviye = 0let enYuksek = takim[0]for (let i = 0; i < takim.length; i++) { if (takim[i].seviye >= 6) { console.log((i + 1) + ". " + takim[i].isim + ": seviye " + takim[i].seviye + ", ulti açık") ultiAcik++ } else { console.log((i + 1) + ". " + takim[i].isim + ": seviye " + takim[i].seviye + ", ulti kapalı") } toplamSeviye = toplamSeviye + takim[i].seviye if (takim[i].seviye > enYuksek.seviye) { enYuksek = takim[i] }}console.log("Ultisi açık olan: " + ultiAcik)console.log("Toplam seviye: " + toplamSeviye)console.log("En yüksek seviye: " + enYuksek.isim + " (" + enYuksek.seviye + ")")1. Annie: seviye 7, ulti açık2. Yasuo: seviye 5, ulti kapalı3. Lux: seviye 6, ulti açık4. Garen: seviye 4, ulti kapalı5. Jinx: seviye 9, ulti açıkUltisi açık olan: 3Toplam seviye: 31En yüksek seviye: Jinx (9)Sınır denemesi: Lux tam 6. seviyede; >= yerine > yazsaydın Lux'un ultisi kapalı görünür ve Ultisi açık olan: 2 çıkardı. Jinx'i dizinin en başına taşı: en yüksek yine Jinx çıkmalı. Herkesin seviyesini 6'nın altına indir: Ultisi açık olan: 0 çıkmalı. Toplamı da bir kez elle doğrula: 7, 5, 6, 4 ve 9'un toplamı 31.
Hata avı
Aşağıdaki program manası 0 olan şampiyonları saymalı ama içinde üç hata var. Gözle aramadan, yalnızca hata mesajlarını okuyarak düzelt: çalıştır, mesajı oku, ilk hatayı düzelt, yeniden çalıştır.
const takim = [ { isim: "Lux", mana: 120 }, { isim: "Annie", mana: 0 }, { isim: "Ahri", mana: 35 }]let bosMana = 0for (let i = 0, i <= takim.length(), i++) { if (takim[i].mana === 0) { bosMana++ }}console.log("Manası biten: " + bosMana)C:\kod\ogren\ders5.js:7for (let i = 0, i <= takim.length(), i++) { ^ SyntaxError: Identifier 'i' has already been declared at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Hepsini düzeltince çıktı Manası biten: 1 olmalı.
İpucu 1
İlk mesaj yanıltıcı: i iki kez tanımlanmadı. for'un parantezindeki üç parçayı hangi işaret ayırır?
İpucu 2
İkinci mesaj TypeError: takim.length is not a function olacak. length bir alan mı, metot mu?
İpucu 3
Üçüncü mesaj TypeError: Cannot read properties of undefined (reading 'mana'). Üç elemanlı dizide döngü kaç tur dönüyor? Son turda i kaç, takim[i] ne?
Çözümü göster
const takim = [ { isim: "Lux", mana: 120 }, { isim: "Annie", mana: 0 }, { isim: "Ahri", mana: 35 }]let bosMana = 0for (let i = 0; i < takim.length; i++) { if (takim[i].mana === 0) { bosMana++ }}console.log("Manası biten: " + bosMana)Manası biten: 1Sırasıyla gelen mesajlar: SyntaxError: Identifier 'i' has already been declared (noktalı virgül yerine virgül), TypeError: takim.length is not a function (length'in sonundaki parantez), TypeError: Cannot read properties of undefined (reading 'mana') (<= yüzünden bir fazla tur). Yalnızca ilk virgülü düzeltirsen arada SyntaxError: Unexpected token ')' de görürsün: ikinci virgül de noktalı virgül olmalı.
Ban listesi
Takım seçiminde oyuncuların istekleri sırayla geliyor. Yasaklı (ban) şampiyonlar ve kadroda zaten olanlar alınmayacak:
const yasaklar = ["Yasuo", "Teemo", "Zed"]const istekler = ["Ahri", "Teemo", "Lux", "Ahri", "Zed", "Garen"]const kadro = []İstekleri sırayla gez. İstenen şampiyon yasaklıysa Teemo yasaklı, atlanıyor, kadroda zaten varsa Ahri zaten kadroda, atlanıyor gibi yaz ve sıradaki isteğe geç. İkisi de değilse kadroya ekle ve Lux kadroya girdi gibi yaz. En sonda kadroyu ve kadrodaki şampiyon sayısını yazdır:
Ahri kadroya girdiTeemo yasaklı, atlanıyorLux kadroya girdiAhri zaten kadroda, atlanıyorZed yasaklı, atlanıyorGaren kadroya girdi[ 'Ahri', 'Lux', 'Garen' ]Kadroda 3 şampiyon varİpucu 1
İki sorunun ikisi de includes ile sorulur: yasaklar.includes(sampiyon) ve kadro.includes(sampiyon).
İpucu 2
Sıradaki isteğe geçmek için continue, kadroya eklemek için push.
Çözümü göster
const yasaklar = ["Yasuo", "Teemo", "Zed"]const istekler = ["Ahri", "Teemo", "Lux", "Ahri", "Zed", "Garen"]const kadro = []for (const sampiyon of istekler) { if (yasaklar.includes(sampiyon)) { console.log(sampiyon + " yasaklı, atlanıyor") continue } if (kadro.includes(sampiyon)) { console.log(sampiyon + " zaten kadroda, atlanıyor") continue } kadro.push(sampiyon) console.log(sampiyon + " kadroya girdi")}console.log(kadro)console.log("Kadroda " + kadro.length + " şampiyon var")Ahri kadroya girdiTeemo yasaklı, atlanıyorLux kadroya girdiAhri zaten kadroda, atlanıyorZed yasaklı, atlanıyorGaren kadroya girdi[ 'Ahri', 'Lux', 'Garen' ]Kadroda 3 şampiyon varSınır denemesi: isteklere "teemo" (küçük t) ekle; yasağa takılmadan kadroya girer, çünkü includes büyük-küçük harfe duyarlıdır. istekler'i boş dizi yap: döngü hiç dönmez, ekrana [] ve Kadroda 0 şampiyon var gelir.
TFT dükkânı
9 altının ve 3 yerlik bir kulüben var. Dükkândaki birimlere soldan sağa bakıyorsun:
let altin = 9const kulube = []const dukkan = [ { isim: "Jinx", fiyat: 4 }, { isim: "Garen", fiyat: 1 }, { isim: "Ahri", fiyat: 5 }, { isim: "Lux", fiyat: 4 }, { isim: "Teemo", fiyat: 2 }, { isim: "Annie", fiyat: 1 }]Kurallar, her birim için bu sırayla:
- Kulübe doluysa (3 birim)
Kulübe dolu, alışveriş bittiyaz ve dükkâna bakmayı bırak. - Birimin fiyatı altınından fazlaysa
Ahri için altın yetmiyor (5 gerekiyor, 4 var)gibi yaz ve sıradaki birime geç. Altının fiyata tam yetiyorsa alabilirsin. - Yoksa birimi al: fiyatını altından düş, ismini kulübeye ekle,
Jinx alındı, kalan altın: 5gibi yaz.
En sonda kulübeyi ve kalan altını yazdır. Çıktın şöyle olmalı:
Jinx alındı, kalan altın: 5Garen alındı, kalan altın: 4Ahri için altın yetmiyor (5 gerekiyor, 4 var)Lux alındı, kalan altın: 0Kulübe dolu, alışveriş bittiKulübe: [ 'Jinx', 'Garen', 'Lux' ]Kalan altın: 0İpucu 1
for (const birim of dukkan). Her turda üç soru sırayla: kulübe dolu mu (kulube.length === 3), altın yetmiyor mu, yoksa al.
İpucu 2
Dükkâna bakmayı bırakmak break, sıradaki birime geçmek continue. "Tam yetiyorsa alabilirsin" kuralı yüzünden yetmeme koşulu birim.fiyat > altin olmalı, >= değil.
İpucu 3
Kulübeyi yazdırırken Ders 1'deki virgüllü console.log'u kullan: console.log("Kulübe:", kulube). + ile birleştirirsen dizi Kulübe: Jinx,Garen,Lux gibi düz bir metne dönüşür.
Çözümü göster
let altin = 9const kulube = []const dukkan = [ { isim: "Jinx", fiyat: 4 }, { isim: "Garen", fiyat: 1 }, { isim: "Ahri", fiyat: 5 }, { isim: "Lux", fiyat: 4 }, { isim: "Teemo", fiyat: 2 }, { isim: "Annie", fiyat: 1 }]for (const birim of dukkan) { if (kulube.length === 3) { console.log("Kulübe dolu, alışveriş bitti") break } if (birim.fiyat > altin) { console.log(birim.isim + " için altın yetmiyor (" + birim.fiyat + " gerekiyor, " + altin + " var)") continue } altin = altin - birim.fiyat kulube.push(birim.isim) console.log(birim.isim + " alındı, kalan altın: " + altin)}console.log("Kulübe:", kulube)console.log("Kalan altın: " + altin)Jinx alındı, kalan altın: 5Garen alındı, kalan altın: 4Ahri için altın yetmiyor (5 gerekiyor, 4 var)Lux alındı, kalan altın: 0Kulübe dolu, alışveriş bittiKulübe: [ 'Jinx', 'Garen', 'Lux' ]Kalan altın: 0Sınır denemesi: > yerine >= yazarsan Lux alınamaz (Lux için altın yetmiyor (4 gerekiyor, 4 var)) ve onun yerine kulübeye Teemo girer; tek bir işaret bütün alışverişi değiştirdi. altin'i 3 yap: kulübe hiç dolmaz, Kulübe dolu satırı çıkmaz, kulübede [ 'Garen', 'Teemo' ] kalır. 0 yaparsan hiçbir birim alınamaz ve kulübe [] olur.
Kendini sına
Soru 1
Bu program ne yazar?
const esyalar = ["Kılıç", "Kalkan", "İksir"]console.log(esyalar[esyalar.length])Cevabı göster
undefined. Dizide üç eleman var, numaraları 0, 1, 2. esyalar.length 3'tür ve 3 numaralı yuva yoktur. Son elemanı istiyorsan esyalar[esyalar.length - 1] yazmalısın.
Soru 2
Bu döngü kaç tur döner, ne yazar?
for (let i = 2; i < 10; i = i + 3) { console.log(i)}Cevabı göster
Üç tur döner ve alt alta 2, 5, 8 yazar. Artış parçası i++ olmak zorunda değil; burada her tur 3 ekleniyor. i 11 olunca 11 < 10 yanlış olur ve döngü biter.
Soru 3
Bu programda iki hata var. Ne yazar, nasıl düzelir?
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 1; i <= takim.length; i++) { console.log(takim[i])}Cevabı göster
Alt alta Garen, Jinx, undefined yazar. Sayaç 1'den başladığı için Ahri atlandı; <= yüzünden de olmayan takim[3] okundu. Üç satır çıktığı için ilk bakışta doğru sanabilirsin. Düzeltmek için sayacı let i = 0 ile başlat ve koşulu i < takim.length yap.
Soru 4
Üç satırın her biri ne yazar?
const kulube = ["Annie", "Jinx", "Annie"]console.log(kulube.includes("annie"))console.log(kulube.indexOf("Annie"))console.log(kulube.indexOf("Lux"))Cevabı göster
false, 0, -1. includes büyük-küçük harfe duyarlı olduğu için "annie" bulunamaz. indexOf aranan değeri ilk gördüğü yerde durur; Annie iki kez olsa da ilkinin numarasını (0) verir. Lux dizide yok, bu yüzden -1.
Soru 5
sayac en sonda kaçtır? continue yerine break yazsaydık kaç olurdu?
const canlar = [50, 0, 80, 0, 30]let sayac = 0for (const can of canlar) { if (can === 0) { continue } sayac++}console.log(sayac)Cevabı göster
3. Canı 0 olan iki turda continue çalışır ve sayac++ atlanır; kalan üç turda sayaç artar. break olsaydı 1 yazardı: ilk tur (50) sayılır, ikinci turda 0 görülünce döngü tamamen biter.
Soru 6
Bu program ne yazar?
let altin = 500while (altin < 500) { altin = altin + 100}console.log(altin)Cevabı göster
500. Koşula ilk turdan önce bakılır: 500 < 500 yanlış. Gövde hiç çalışmaz, altin değişmeden kalır.
Soru 7
Bir dizideki her sayıyı iki katına çıkarmak istiyorsun. for...of mu kullanırsın, klasik for mu? Neden?
Cevabı göster
Klasik for. for...of'un verdiği kutuya yeni değer koymak yalnızca o kutuyu değiştirir, dizinin yuvasını değil. Yuvayı değiştirmek için numarasıyla yazman gerekir: sayilar[i] = sayilar[i] * 2. Dizide sayı değil obje olsaydı, objelerin alanlarını for...of ile de değiştirebilirdin.
Soru 8
Bu program neden bitmiyor? Nasıl durdurur, nasıl düzeltirsin?
let i = 0while (i < 3) { console.log("Tur " + i)}Cevabı göster
Gövdede i'yi değiştiren bir satır yok; i hep 0 kalır, 0 < 3 hep doğrudur ve ekrana durmadan Tur 0 yazılır. Terminale tıklayıp Ctrl+C ile durdurursun. Düzeltmek için gövdenin sonuna i++ eklersin; o zaman Tur 0, Tur 1, Tur 2 yazıp biter.
Kayıt noktası
Git bu klasörde Ders 1'de başlatıldı, bu yüzden git init yazmıyorsun; her dersin sonunda iki komut yeter. VS Code terminalinde, C:\kod\ogren klasöründeyken:
Ne zaman çıkar? git commit -m komutunda mesajın tırnaklarını unutunca. Kayıt alınmaz; mesajın içeriğine göre iki farklı hata görürsün:
PS C:\kod\ogren> git commit -m Ders 5: diziler ve döngülerfatal: 5:: '5:' is outside repository at 'C:/kod/ogren'PS C:\kod\ogren> git commit -m Ders 5 diziler ve döngülererror: pathspec '5' did not match any file(s) known to giterror: pathspec 'diziler' did not match any file(s) known to giterror: pathspec 've' did not match any file(s) known to giterror: pathspec 'döngüler' did not match any file(s) known to gitTırnak olmayınca terminal komutu boşluklardan böler. Git mesaj olarak yalnızca ilk sözcüğü (Ders) alır, kalanları kayda eklenecek dosyaların adı sanır. Pathspec "dosya yolu" demek; ikinci hata "5 adında bir dosya bulamadım" diyor. 5: ise C: gibi bir sürücü adına benzediği için ilk hata daha da tuhaf: "5: bu deponun dışında".
Git'in mesajları Windows'un dili Türkçe olsa da İngilizce gelir.
Nasıl düzelir? Mesajı çift tırnak içine al: git commit -m "Ders 5: diziler ve döngüler". git add . ile hazırladığın dosya kaydı bekliyor; yalnızca commit komutunu düzeltip yeniden çalıştırman yeter.
Bir sonraki derste fonksiyonların sonuç döndürmesini (return) öğrenecek ve bu dersteki takımları rastgele hasarla birbirine saldırtan ilk mini projeni, takım savaşını yazacaksın.