Blok 1 · Ders 2
Karşılaştırma ve karar: if / else
Programın duruma göre farklı yol seçmesini sağlıyorsun: doğru/yanlış değerleri, karşılaştırma işaretleri ve if/else.
Bu dersin sonunda
- Altı karşılaştırma işaretiyle cevabı
trueya dafalseolan sorular yazabilir,=ile===arasındaki farkı açıklayabilirsin ifveelseile programının duruma göre farklı satırlar çalıştırmasını sağlayabilirsin- Bir kararı kod yazmadan önce akış şemasıyla çizebilirsin
- Kodunu sınır değerleriyle (0, 30, 31) deneyip hatasız çalıştığı hâlde yanlış karar veren yeri yakalayabilirsin
SyntaxError,ReferenceErrorveTypeError'ın ne zaman çıktığını, hangisinin programı hiç başlatmadığını söyleyebilirsin- Eksik ya da fazla parantezi hata mesajından ve VS Code'un renklerinden bulup düzeltebilirsin
Bu sayfada
- Soru sormak: true ve false
- Karşılaştırma işaretleri
- Üç eşittir: =, == ve ===
- if: koşul doğruysa çalıştır
- else: değilse
- Akış şeması: kararı önce çiz
- En sinsi hata: koşulda tek =
- Sınır değerleri: "çalışıyor" ile "doğru" aynı şey değil
- Hata türleri: hangisi ne zaman çıkar?
- Parantezleri eşleştirmek
- Sık hatalar
- Görevler
- Kendini sına
- Kayıt noktası
Şimdiye kadar yazdığın programlar her çalıştırmada aynı satırları aynı sırayla çalıştırdı. Ders 1'in dükkân görevinde altını 800 yapınca program "paran yetmiyor" diyemedi, altını eksiye düşürdü. Gerçek programlar ise sürekli karar verir: can sıfıra indiyse "öldün" yazar, mana yetiyorsa yeteneği kullanır. Bu derste programına soru sormayı ve cevaba göre yol seçmeyi öğreneceksin; dersin sonunda o dükkânı da kendin onaracaksın.
Soru sormak: true ve false
Bir karar vermeden önce bir soru sorarsın: Canım bitti mi? Altınım yetiyor mu? JavaScript de aynısını yapar. Ona iki değeri karşılaştırmasını söylersin, o da sana iki cevaptan birini verir: true (doğru, evet) ya da false (yanlış, hayır).
console.log(5 > 3)console.log(5 < 3)console.log(10 > 10)truefalsefalse5 > 3 "5, 3'ten büyük mü?" diye sorar; büyüktür, cevap true. 5 < 3 "5, 3'ten küçük mü?" diye sorar; değildir, cevap false. Üçüncü satıra dikkat et: 10, 10'dan büyük değildir, ona eşittir. Bu küçük ayrıntı, dersin ilerisinde sinsi bir hatanın kaynağı olacak.
true ve false, metin ve sayıdan sonra öğrendiğin üçüncü değer türüdür. Tırnaksız yazılırlar ve bu türün yalnızca bu iki değeri vardır.
Karşılaştırmanın cevabını, bir hesabın sonucu gibi değişkene de koyabilirsin:
let hp = 40const hayatta = hp > 0console.log(hayatta)console.log("Hayatta mı? " + hayatta)trueHayatta mı? trueİkinci satırı Ders 1'deki gibi sağdan sola oku: önce hp > 0 sorusu sorulur, cevabı hayatta kutusuna konur. Kutunun içinde artık true var. Metinle + ile birleştirince ekrana true sözcüğü olarak yazılır.
true) soldaki kutuya konur.Karşılaştırma işaretleri
JavaScript'te kullanacağın altı karşılaştırma işareti var. Hepsi bir soru sorar ve cevabı true ya da false olur. Tablodaki örneklerde hp kutusunda 30 olduğunu düşün:
| İşaret | Sorduğu soru | Örnek | Sonuç |
|---|---|---|---|
=== | eşit mi? | hp === 30 | true |
!== | farklı mı? | hp !== 30 | false |
< | küçük mü? | hp < 30 | false |
> | büyük mü? | hp > 30 | false |
<= | küçük ya da eşit mi? | hp <= 30 | true |
>= | büyük ya da eşit mi? | hp >= 30 | true |
Tabloyu kendin doğrula:
let hp = 30console.log(hp === 30)console.log(hp !== 30)console.log(hp < 30)console.log(hp > 30)console.log(hp <= 30)console.log(hp >= 30)truefalsefalsefalsetruetrue< ile <= arasındaki tek fark sınırın kendisidir: hp tam 30 iken hp < 30 "hayır", hp <= 30 "evet" der.
Klavyede: < sol Shift'in hemen sağındaki tuşta, > aynı tuşta Shift ile; = Shift+0, ! Shift+1. İki ya da üç karakterli işaretlerin her karakteri ayrı bir tuştur: <= için önce <, sonra =; === için üç kez =. Bazı kod yazı tipleri bu karakterleri ekranda ≤ ya da ≥ gibi tek işarete birleştirir; yine de klavyede hep ayrı tuşlara basarsın.
İki karakterli işaretleri söylediğin sırayla yaz: "küçük ya da eşit" <=, "büyük ya da eşit" >=. Eşittir her zaman sağda durur. Ters yazarsan ya program hiç başlamaz (=<) ya da daha kötüsü, hata vermeden yanlış çalışır (=>). İkisini de Sık hatalar bölümünde göreceksin.
Metinleri karşılaştırmak
=== ve !== yalnızca sayılarla değil, metinlerle de çalışır. Metinleri harfi harfine karşılaştırırlar:
const sampiyon = "Ahri"console.log(sampiyon === "Ahri")console.log(sampiyon === "ahri")console.log(sampiyon !== "Lux")truefalsetrueİkinci satır false verdi: büyük-küçük harf farklıysa metinler eşit sayılmaz. "Ahri" ile "ahri" JavaScript için iki ayrı metindir, tıpkı hp ile Hp'nin iki ayrı ad olması gibi.
Üç eşittir: =, == ve ===
Ders 1'de tek = işaretinin "eşittir" değil, "sağdakini sola koy" demek olduğunu gördün. Karşılaştırmak için başka bir işaret gerekiyor: üç eşittir (===). Bir de iki eşittir (==) var. Üçü birbirine çok benzer ama işleri bambaşka:
| Yazılış | Okunuşu | Ne yapar? |
|---|---|---|
hp = 0 | "hp'ye 0 koy" | Kutunun içini değiştirir. Soru sormaz. |
hp === 0 | "hp, 0'a eşit mi?" | Sorar, cevabı true ya da false. Kutuya dokunmaz. |
hp == 0 | "hp, 0'a eşit mi?" (türe bakmadan) | Gevşek karşılaştırma: türler farklıysa önce birini öbürüne çevirir. Kullanma. |
Farkı kendi gözünle gör:
let hp = 50console.log(hp === 0)console.log(hp = 0)console.log(hp)false00İkinci satır bir soru sormadı: hp kutusuna 0 koydu ve koyduğu değeri ekrana yazdı. Üçüncü satır bunu kanıtlıyor; can gerçekten 0 oldu. Karşılaştırmak isterken tek = yazmak bu dersin en sinsi hatasıdır; birazdan if içinde neye yol açtığını göreceksin.
Neden == değil de ===?
== karşılaştırmadan önce iki tarafı birbirine benzetmeye çalışır. Örneğin bir taraf metin, öbürü sayıysa metni sayıya çevirip öyle karşılaştırır. Sonuç da şaşırtıcı olur:
console.log("5" == 5)console.log("5" === 5)console.log(100 === "100")truefalsefalse=== hem türe hem değere bakar. "5" bir metin, 5 bir sayı; türleri farklı olduğu için eşit değiller. Ders 1'deki 100 ile "100" da bu yüzden eşit sayılmaz.
== işaretinin neyi neye çevirdiğini ezberlemene gerek yok; metin ile sayı arasındaki dönüşümleri Ders 9'da göreceksin. Kural tek: her zaman === ve !== kullan. Aynı sebeple != yerine de !== yazılır.
if: koşul doğruysa çalıştır
Karşılaştırma bir soru soruyor; şimdi sıra cevaba göre bir şey yapmakta. if (İngilizcede "eğer") JavaScript'e şunu söyler: "Parantezin içindeki sorunun cevabı true ise süslü parantezlerin içindeki satırları çalıştır, false ise onları atla."
ders2.js dosyasını temizle ve şu programı yaz. Süslü parantezler Türkçe Q klavyede AltGr+7 ({) ve AltGr+0 (}) tuşlarındadır:
let hp = 0if (hp <= 0) { console.log("Öldün")}console.log("Maç sürüyor")PS C:\kod\ogren> node ders2.jsÖldünMaç sürüyorhp <= 0 sorusunun cevabı true, bu yüzden süslü parantezin içindeki satır çalıştı.
Şimdi ilk satırı let hp = 40 yap ve yeniden çalıştır:
let hp = 40if (hp <= 0) { console.log("Öldün")}console.log("Maç sürüyor")Maç sürüyorBu sefer hp <= 0 sorusunun cevabı false. JavaScript süslü parantezlerin içine hiç girmedi, kapanış } işaretinin arkasından devam etti. Maç sürüyor satırı if'in dışında olduğu için iki durumda da çalışır.
if cümlesinin parçaları.Parçaları tek tek:
if: anahtar sözcük. Her zaman küçük harfle yazılır.( )koşul parantezi: sorulacak soru bunun içine yazılır. Parantez zorunludur.- Koşul: cevabı
trueya dafalseolan bir soru; buradahp <= 0. { }süslü parantez: koşulun cevabıtrueolursa çalışacak satırları bir arada tutar. Bu satır grubuna blok denir.- Girinti: bloğun içindeki satırlar 4 boşluk içeriden başlar. Hangi satırın bloğa ait olduğu bir bakışta görünür.
Koşulda boolean değişken
Koşulun parantezine cevabı true ya da false olan her şey yazılabilir. Cevabı daha önce bir değişkene koyduysan doğrudan o değişkeni yazarsın:
let hp = 40const hayatta = hp > 0if (hayatta) { console.log("Savaşa devam")}Savaşa devamhayatta zaten true ya da false tuttuğu için if (hayatta === true) yazmana gerek yok. İyi seçilmiş bir adla koşul bir cümle gibi okunur: "eğer hayattaysa".
Girinti kimin için?
JavaScript girintiye bakmaz. Bloğun içini hiç içeri almadan yazsan da program aynı çalışır:
let hp = 0if (hp <= 0) {console.log("Öldün")}console.log("Maç sürüyor")ÖldünMaç sürüyorÇalışıyor, ama hangi satırın bloğa ait olduğunu görmek için süslü parantezleri saymak zorundasın. Bloklar iç içe geçmeye başlayınca girintisiz kod okunmaz hâle gelir. Girinti bilgisayar için değil, kodu okuyan insan için; o insan çoğu zaman bir hafta sonraki sensin.
Süslü parantezi unutursan
if süslü parantez olmadan da yazılabilir; o zaman if'e yalnızca hemen altındaki tek satır bağlıdır. Girinti burada seni kandırabilir:
let hp = 50if (hp <= 0) console.log("Öldün") console.log("Yeniden doğma: 10 saniye")Yeniden doğma: 10 saniyeCan 50, ölmedin; ama ekranda yeniden doğma yazısı var. İki satır da içeride durduğu için ikisi de if'e aitmiş gibi görünüyor. Oysa JavaScript girintiye bakmaz: süslü parantez yoksa if'e yalnızca ilk satır bağlıdır, dördüncü satır her durumda çalışır. Hata mesajı da yok; program sessizce yanlış çalışıyor.
Kural: tek satırlık bloklarda bile süslü parantezi her zaman yaz.
else: değilse
if tek başına "koşul doğruysa şunu yap, değilse hiçbir şey yapma" der. Çoğu zaman ikinci yolu da istersin: ölmediysen savaşa devam et. Bunun için if bloğunun kapanış süslüsünün hemen arkasına else (İngilizcede "değilse") yazılır:
let hp = 25if (hp <= 0) { console.log("Öldün")} else { console.log("Savaşa devam")}console.log("Maç sürüyor")Savaşa devamMaç sürüyorKoşulun cevabı false olduğu için ilk blok atlandı, else bloğu çalıştı. hp'yi 0 yaparsan tersi olur: Öldün yazılır, Savaşa devam yazılmaz. Hangi değeri verirsen ver, iki bloktan tam olarak biri çalışır: ikisi birden asla, hiçbiri de asla.
else için üç kural:
else'in koşulu yoktur. "Geri kalan her durum" demektir; arkasına parantez yazılmaz.else,ifbloğunun kapanış süslüsünden sonra gelir. Bu kursta ikisini aynı satıra yazıyoruz:} else {.elsetek başına kullanılamaz; her zaman birif'in arkasından gelir.
İki bloğun içine de istediğin kadar satır koyabilirsin. Ders 1'deki hesapları da kullanabilirsin:
let hp = 100const hasar = 120hp = hp - hasarif (hp <= 0) { console.log("Öldün") console.log("Yeniden doğma: 10 saniye")} else { console.log("Hasar aldın") console.log("Kalan can: " + hp)}ÖldünYeniden doğma: 10 saniye120 hasar 100 canı eksiye düşürdü (-20), koşul true oldu ve ilk bloğun iki satırı da çalıştı. hasar'ı 30 yaparsan bu kez else bloğu çalışır ve ekrana Hasar aldın ile Kalan can: 70 gelir.
Akış şeması: kararı önce çiz
Program büyüdükçe kararları kafanda tutmak zorlaşır. Yazılımcılar bu yüzden karışık kararları kod yazmadan önce kâğıda çizer. Bu çizime akış şeması denir ve üç şekil yeter:
- Oval: başla ve bitir.
- Dikdörtgen: bir iş, yani bir ya da birkaç satır kod.
- Elmas: bir karar. İçine soru yazılır, içinden iki ok çıkar: biri
true(evet), birifalse(hayır).
hp 25 iken program mor yoldan gider; kesik çizgili kutu hiç çalışmaz.Şemayı okumak için parmağını Başla'ya koy ve okları izle. Elmasa gelince soruyu hp'nin o anki değeriyle cevapla: 25, 0'dan küçük ya da 0'a eşit mi? Hayır; o zaman false okunu izle. İki yol en sonda yeniden birleşir ve program Maç sürüyor ile devam eder.
En sinsi hata: koşulda tek =
Karşılaştırmak isterken === yerine tek = yazmak, yeni başlayanların en sık yaptığı hatalardan biridir. Kötü haber: JavaScript bu hatada mesaj vermez. Önce ne yazacağını tahmin et, sonra çıktıya bak:
let hp = 50if (hp = 0) { console.log("Öldün")} else { console.log("Hayattasın")}console.log("Can: " + hp)HayattasınCan: 0Program "Hayattasın" diyor ama canın 0 olmuş. Olan şu: hp = 0 bir soru değil, bir komuttur. hp kutusuna 0 konur ve koşulun yerine bu 0 geçer. JavaScript koşulda 0 görünce onu false gibi sayar (hangi değerlerin true, hangilerinin false sayıldığını Ders 12'de göreceksin), bu yüzden else çalıştı.
Eksik yazılan iki = hem yanlış yolu seçtirdi hem de canı sildi. 0 dışında bir sayı koysaydın tersi olurdu: if (hp = 100) her seferinde if bloğunu çalıştırır ve canı 100 yapar.
if (hp = 0) {if (hp === 0) {Sınır değerleri: "çalışıyor" ile "doğru" aynı şey değil
Takım arkadaşın şu kuralı istiyor: "Canın 30 ya da daha azsa ekrana Canın azaldı, geri çekil yaz; değilse Savaşa devam yaz." Şu kodu yazdın:
let hp = 10if (hp < 30) { console.log("Canın azaldı, geri çekil")} else { console.log("Savaşa devam")}Canın azaldı, geri çekil10 ile doğru çalıştı. hp'yi 80 yapıp dene: Savaşa devam yazar, o da doğru. Program hatasız çalışıyor; peki iş bitti mi?
Kuralı bir daha oku: "30 ya da daha azsa". Şimdi hp'yi tam 30 yap:
# let hp = 10 ikenPS C:\kod\ogren> node ders2.jsCanın azaldı, geri çekil# let hp = 80 ikenPS C:\kod\ogren> node ders2.jsSavaşa devam# let hp = 30 ikenPS C:\kod\ogren> node ders2.jsSavaşa devamCanın tam 30 iken program "Savaşa devam" diyor; kurala göre geri çekilmen gerekiyordu. Program çalışıyor ama doğru değil. Sorun < işaretinde: 30 < 30 sorusunun cevabı false. Kural "30 ya da daha az" dediği için doğru işaret <=:
let hp = 30if (hp <= 30) { console.log("Canın azaldı, geri çekil")} else { console.log("Savaşa devam")}Canın azaldı, geri çekilİki kod yalnızca 30'da ayrılıyor; bir hata tek bir sayının arkasına saklanabilir. Bu yüzden bir koşulu denerken rastgele sayılar değil, sınır değerleri seçilir.
Her koşulu şu değerlerle dene:
- Sınırın kendisi: 30.
<mı<=mü doğru, burada anlaşılır. - Hemen altı ve hemen üstü: 29 ve 31.
- Uç değerler: 0, hatta eksi bir sayı ya da çok büyük bir sayı. Ders 1'de altının eksiye düşebildiğini gördün; can da düşebilir.
0'ı dene: Canın azaldı, geri çekil yazar. Kurala uygun ama tuhaf, çünkü canı 0 olan biri zaten ölmüştür. Sınır değerleri koddaki hataları olduğu kadar kuraldaki eksikleri de ortaya çıkarır. Üç ayrı durumu ("öldün", "geri çekil", "savaşa devam") birbirinden ayırmayı Ders 3'te öğreneceksin.
Hata türleri: hangisi ne zaman çıkar?
Ders 1'de üç hata türünü tanıdın ve SyntaxError'ın programı hiç başlatmadığını gördün. if işin içine girince yeni bir durum ortaya çıkıyor: bazı satırlar hiç çalışmayabilir. Bu da hataların ne zaman ortaya çıkacağını değiştirir.
Uyuyan hata: ReferenceError
Aşağıdaki programın 4. satırında değişkenin adı yanlış yazılmış (oyuncuu). Yine de çalıştırınca hiçbir hata görmezsin:
const oyuncu = "Ahri"let hp = 60if (hp <= 0) { console.log(oyuncuu + " öldü")} else { console.log(oyuncu + " savaşıyor")}Ahri savaşıyorKoşul false olduğu için 4. satır hiç çalışmadı; JavaScript oyuncuu adını aramaya hiç kalkmadı. Şimdi hp'yi 0 yap:
const oyuncu = "Ahri"let hp = 0if (hp <= 0) { console.log(oyuncuu + " öldü")} else { console.log(oyuncu + " savaşıyor")}C:\kod\ogren\ders2.js:4 console.log(oyuncuu + " öldü") ^ ReferenceError: oyuncuu is not defined at Object.<anonymous> (C:\kod\ogren\ders2.js:4:17) ... Node.js v24.20.0Hata, satır çalıştığı anda uyandı. Gerçek bir oyunda bu, Ahri'nin ilk ölümüne kadar kimsenin fark etmediği bir hata olurdu. ReferenceError bir adı kullanıldığı anda arar; o satıra hiç gelinmezse hata da hiç görünmez.
Uyuyan hata: TypeError
Aynısı TypeError için de geçerli. Burada can const ile açılmış, yani mühürlü; ama bunu ancak iksir içilmeye çalışılınca öğreniyorsun:
const hp = 20const iksir = 50if (hp < 30) { hp = hp + iksir}console.log("Can: " + hp)C:\kod\ogren\ders2.js:4 hp = hp + iksir ^ TypeError: Assignment to constant variable. at Object.<anonymous> (C:\kod\ogren\ders2.js:4:8) ... Node.js v24.20.0hp 60 olsaydı koşul false olur, 4. satır çalışmaz ve program sorunsuzca Can: 60 yazardı. Düzeltmesi Ders 1'deki gibi: değeri değişecek kutu let ile açılır.
Hiç uyumayan hata: SyntaxError
Şimdi bir yazım hatasını hiç çalışmayacak bir bloğa koy. hp 80, yani if bloğu atlanacak:
let hp = 80console.log("Maç başladı")if (hp <= 0) { console.log("Öldün"}C:\kod\ogren\ders2.js:4 console.log("Öldün" ^^^^^^^ SyntaxError: missing ) after argument list at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Maç başladı bile yazılmadı. Node programı çalıştırmadan önce dosyanın tamamını okur ve yazım kurallarını denetler; çalışacak satır da çalışmayacak satır da bu denetimden geçer. Bu yüzden SyntaxError hiç uyumaz: dosyada tek bir yazım hatası varsa program hiç başlamaz.
| Tür | Ne zaman çıkar? | Bu dersteki örnekler |
|---|---|---|
SyntaxError | Dosya okunurken; hiçbir satır çalışmaz | =<, eksik }, else önünde unutulan } |
ReferenceError | Hatalı satır çalışınca | yanlış yazılmış ad (oyuncuu), True |
TypeError | Hatalı satır çalışınca | blok içinde const kutuyu değiştirmek |
| Mantık hatası | Hiç mesaj çıkmaz | <= yerine <, koşulda tek = |
Bu tablodan çıkan alışkanlık: programını denerken her bloğun en az bir kez çalıştığından emin ol. if bloğunu çalıştıran bir değer, else bloğunu çalıştıran başka bir değer seç. Sınır değerleri bunu zaten sağlar: 30 bir bloğa, 31 öbürüne girer.
Parantezleri eşleştirmek
Bir if satırında iki çeşit parantez var: koşul için ( ), blok için { }. Bloğun içindeki console.log(...) da kendi parantezini getirir. Her açılan parantez aynı türden bir kapanışla kapanmalı; biri eksik ya da fazla olursa program hiç başlamaz (SyntaxError).
Alışkanlık: aç, kapat, sonra doldur
Parantezi açtığın anda kapat, içini sonra doldur. if yazacaksan önce iskeleti kur:
if () {}Sonra imleci parantezin içine götürüp koşulu, süslülerin arasına geçip bloğu yaz. VS Code da bu konuda yardım eder: ( ya da { yazdığında kapanışını kendisi ekler. O kapanışı silme, içini doldur.
VS Code'un yardımı
- Renkli çiftler: VS Code eşleşen parantezleri aynı renge boyar. Varsayılan koyu temada en dıştaki çift sarı, onun içindeki pembe-mor, daha içteki mavidir (açık temada renkler başka). Eşi olmayan bir parantez, açılış da olsa kapanış da olsa, kırmızı görünür.
- Eşini göstermek: İmleci bir parantezin hemen yanına koyduğunda hem o parantez hem de eşi küçük bir kutuyla vurgulanır. Uzun bir bloğun nerede bittiğini böyle bulursun. Menüden Go → Go to Bracket'i seçersen imleç eşine atlar.
- Kırmızı dalgalı çizgi: Yazım hatalarının çoğunu VS Code sen çalıştırmadan, altını kırmızı dalgalı çizerek gösterir. Fareyi çizginin üstüne getirince açıklamasını okursun. Bu açıklama Node'un mesajından farklı olabilir (örneğin
'}' expected.) ama aynı sorunu gösterir.
{ işaretinin yanındayken eşi olan } de vurgulanır.Şimdi bilerek hata yap. Aşağıdaki programı yaz; if bloğunun kapanış süslüsü bilerek eksik (VS Code onu kendiliğinden eklerse sil). Kaydet ve çalıştır:
let hp = 0if (hp <= 0) { console.log("Öldün")console.log("Maç sürüyor")PS C:\kod\ogren> node ders2.jsC:\kod\ogren\ders2.js:4console.log("Maç sürüyor") SyntaxError: Unexpected end of input at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0VS Code son satırın sonunu kırmızı dalgalı çizgiyle işaretliyor; fareyle üstüne gelince '}' expected. yazıyor.
Unexpected end of input "beklenmedik girdi sonu" demek: Node dosyanın sonuna geldi ama bir { hâlâ kapanmamıştı. Mesajdaki satır numarası eksik süslünün yerini değil, dosyanın son satırını gösterir. Kapanmayan süslüyü bulmak için kendi VS Code'unda 2. satırdaki { işaretine bak: eşi olmadığı için kırmızı görünür.
Sık hatalar
Bu derste en sık karşılaşacağın hatalar burada. Bir hata aldığında buraya ya da bütün derslerin hatalarının toplandığı hata rehberine bak.
SyntaxError: Unexpected token '<' (ters yazılmış <=)Ne zaman çıkar? "Küçük ya da eşit" işaretini ters yazınca: =<.
let hp = 20if (hp =< 30) { console.log("Geri çekil")}C:\kod\ogren\ders2.js:2if (hp =< 30) { ^ SyntaxError: Unexpected token '<' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Nasıl düzelir? JavaScript = işaretini "koy" diye okudu, arkasından gelen < ile ne yapacağını bilemedi. İşareti söylediğin sırayla yaz: "küçük ya da eşit" <=, "büyük ya da eşit" >=; eşittir hep sağda. Dikkat: >= yerine => (önce eşittir, sonra büyüktür) yazarsan hata bile almazsın. JavaScript => işaretini Ders 10'da göreceğin bambaşka bir yapı sanar ve koşulu her seferinde doğru sayar: hp 10 iken bile if (hp => 30) bloğu çalışır.
SyntaxError: Unexpected end of inputNe zaman çıkar? Açtığın bir { işaretini kapatmayı unutunca. Node dosyanın sonuna gelir ama blok hâlâ açıktır. Yukarıda, VS Code'un yardımı bölümünde gördün.
Nasıl düzelir? Mesajdaki satır numarası dosyanın son satırını gösterir (dosyanın sonunda boş satır varsa o boş satırı), eksik süslünün yerini değil. VS Code'da eşi olmayan { kırmızı görünür; imleci yanına koyduğunda bir eş de vurgulanmaz. Kapanışı bloğun bittiği yere, if ile aynı hizaya yaz.
SyntaxError: Unexpected token '}' (fazla süslü parantez)Ne zaman çıkar? Fazladan bir } yazınca, çoğu zaman bir bloğu iki kez kapatınca.
let hp = 0if (hp <= 0) { console.log("Öldün")}}console.log("Maç sürüyor")C:\kod\ogren\ders2.js:5}^ SyntaxError: Unexpected token '}' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Nasıl düzelir? ^ işaretinin gösterdiği } fazla: onun bir açılışı yok. Sil. VS Code da eşi olmayan bu } işaretini kırmızıya boyar.
SyntaxError: Unexpected token 'else'Ne zaman çıkar? if bloğunu kapatmadan else yazınca.
let hp = 25if (hp <= 0) { console.log("Öldün")else { console.log("Savaşa devam")}C:\kod\ogren\ders2.js:4else {^^^^ SyntaxError: Unexpected token 'else' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Nasıl düzelir? if bloğu hâlâ açıkken gelen else'i JavaScript yersiz buldu: else ancak bir if bloğu kapandıktan sonra gelebilir. else'in önüne } koy: } else {.
SyntaxError: Unexpected token '{' (else'e koşul yazmak)Ne zaman çıkar? else'in arkasına bir koşul yazınca.
let hp = 25if (hp <= 0) { console.log("Öldün")} else (hp > 0) { console.log("Hayattasın")}C:\kod\ogren\ders2.js:4} else (hp > 0) { ^ SyntaxError: Unexpected token '{' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Nasıl düzelir? else'in koşulu olmaz; "geri kalan her durum" demektir. JavaScript (hp > 0) kısmını else'in yapacağı iş sandı ve arkasından gelen { işaretini beklemiyordu. Koşulu sil: } else {.
Süslüyü alt satıra yazmışsan durum daha kötü: hata çıkmaz, alttaki blok her seferinde çalışır ve hp 0 iken ekrana hem Öldün hem Hayattasın gelir. Birden çok koşulu sırayla denemenin doğru yolunu Ders 3'te öğreneceksin.
SyntaxError: Unexpected token '{' (If büyük harfle)Ne zaman çıkar? if'i büyük harfle yazınca: If.
let hp = 0If (hp <= 0) { console.log("Öldün")}C:\kod\ogren\ders2.js:2If (hp <= 0) { ^ SyntaxError: Unexpected token '{' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Nasıl düzelir? JavaScript büyük-küçük harfe duyarlıdır ve If'i tanımaz. Satırı console.log("…") gibi bir komut sanır: If adlı bir komuta parantez içinde bir şey veriyorsun. Böyle bir komutun arkasından { gelemeyeceği için { işaretini beklenmedik bulur. Anahtar sözcükleri hep küçük harfle yaz: if, else.
Süslüyü alt satıra yazmışsan mesaj bu kez ReferenceError: If is not defined olur; çözüm aynı.
SyntaxError: Unexpected identifier 'hp'Ne zaman çıkar? Koşulun parantezlerini unutunca.
let hp = 0if hp <= 0 { console.log("Öldün")}C:\kod\ogren\ders2.js:2if hp <= 0 { ^^ SyntaxError: Unexpected identifier 'hp' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Nasıl düzelir? Identifier "ad" demek: JavaScript if'ten sonra ( bekliyordu, karşısına hp adı çıktı. Koşulu parantez içine al: if (hp <= 0) {. Parantez her if'te zorunludur.
ReferenceError: True is not definedNe zaman çıkar? true ya da false sözcüğünü büyük harfle yazınca.
let hayatta = TrueC:\kod\ogren\ders2.js:1let hayatta = True ^ ReferenceError: True is not defined at Object.<anonymous> (C:\kod\ogren\ders2.js:1:15) ... Node.js v24.20.0Nasıl düzelir? JavaScript yalnızca küçük harfli true ve false'u tanır; True'yu bir değişken adı sandı ve bulamadı. Küçük harfle yaz. Tırnak da koyma: "true" bir metindir, boolean değildir.
=: hata yok, sonuç yanlışNe zaman çıkar? Karşılaştırmak isterken === yerine = yazınca: if (hp = 0). Mesaj çıkmaz; program yanlış yolu seçer ve değişkenin değerini de değiştirir. Yukarıda, En sinsi hata bölümünde gördün.
Nasıl düzelir? Koşul bir soru sormalı; tek = soru sormaz, değer koyar. Koşulun içindeki tek = işaretini kuralın istediği karşılaştırma işaretiyle değiştir: eşitliği soruyorsan ===, "en az" diyorsan >= gibi.
if: yalnızca ilk satır koşula bağlıNe zaman çıkar? if'ten sonra süslü parantez koymayıp altına birden çok satır yazınca. Mesaj çıkmaz; ikinci satırdan sonrası her durumda çalışır. Yukarıda, Süslü parantezi unutursan bölümünde gördün.
Nasıl düzelir? Bloğu her zaman { } içine al, tek satır olsa bile.
Görevler
Her görevi ders2.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örevlerde verilen sınır değerlerini tek tek dene: program hatasız çalıştı diye görevi bitmiş sayma.
Ult hazır mı?
Çoğu şampiyonun ulti (R) ilk kez 6. seviyede açılır. seviye adında bir değişken oluştur. Seviye 6 ya da daha fazlaysa Ultin hazır, R tuşuna basabilirsin, değilse Ult için 6. seviyeyi bekle yazdır. Kodu yazmadan önce akış şemasını kâğıda çiz: bir elmas, iki yol.
seviye 6 iken beklenen çıktı:
Ultin hazır, R tuşuna basabilirsinProgramını seviye 5, 6 ve 7 ile ayrı ayrı çalıştır.
İpucu 1
"6 ya da daha fazla" ifadesinin işareti tabloda var: büyük ya da eşit.
İpucu 2
İskelet if (seviye >= 6) { ile başlıyor, arkasından } else { geliyor. Her blokta bir console.log yeter.
Çözümü göster
const seviye = 6if (seviye >= 6) { console.log("Ultin hazır, R tuşuna basabilirsin")} else { console.log("Ult için 6. seviyeyi bekle")}Ultin hazır, R tuşuna basabilirsinSınır denemesi: 5 → Ult için 6. seviyeyi bekle; 6 ve 7 → Ultin hazır, R tuşuna basabilirsin. >= yerine > yazdıysan program 6'da yanlış karar verir; 6'yı denemek bu yüzden şart.
seviye programın içinde değişmediği için const yeterli; denemek için değerini elle değiştirip yeniden çalıştırıyorsun. İstersen kararı önce bir boolean'a koyabilirsin: const ultHazir = seviye >= 6, sonra if (ultHazir) {. Sonuç aynıdır.
Mavi mi, kırmızı mı?
Sihirdar Vadisi'nde mavi takımın üssü sol altta, kırmızı takımınki sağ üstte. taraf adında bir değişkene "mavi" ya da "kırmızı" koy. Taraf "mavi" ise Üssün sol altta, değilse Üssün sağ üstte yazdır.
taraf "mavi" iken beklenen çıktı:
Üssün sol alttaSonra taraf'ı sırayla "kırmızı", "Mavi" (büyük M) ve "yeşil" yapıp çalıştır. Hangi sonuçlar doğru, hangileri yanlış? Nedenini birer cümleyle açıkla.
İpucu 1
Metinler de === ile karşılaştırılır: taraf === "mavi".
İpucu 2
"Mavi" ile "mavi" JavaScript için aynı metin mi? Metinleri karşılaştırmak bölümündeki "Ahri" ile "ahri" örneğini hatırla.
Çözümü göster
const taraf = "mavi"if (taraf === "mavi") { console.log("Üssün sol altta")} else { console.log("Üssün sağ üstte")}Üssün sol altta"kırmızı"→Üssün sağ üstte. Doğru."Mavi"→Üssün sağ üstte. Yanlış:"Mavi" === "mavi"sorusunun cevabıfalse, çünkü büyük-küçük harf farklı. Program mavi takımdaki oyuncuyu kırmızı tarafa gönderdi."yeşil"→Üssün sağ üstte. Yanlış: yeşil diye bir taraf yok, amaelse"geri kalan her durum" demek olduğu için bu değer deelse'e düştü.
İki yanlışın da hata mesajı yok; ikisi de mantık hatası. Beklenmedik değerleri ayrıca yakalamayı Ders 3'te öğreneceksin. Aynı kararı !== ile de yazabilirsin: if (taraf !== "mavi") dersen iki bloğun yerini değiştirmen gerekir.
Dükkânı onar
Ders 1'deki dükkân görevini hatırla: kılıç 450 altın, iki tane alıyorsun; altının yetmeyince program eksiye düşüyordu. Şimdi programı akıllı yap:
- Altının iki kılıca yetiyorsa kılıçları al ve kalan altını yaz.
- Yetmiyorsa altına dokunma ve kaç altın eksik olduğunu yaz.
altin 1000 iken beklenen çıktı:
2 kılıç aldın, kalan altın: 100altin 800 iken beklenen çıktı:
Altının yetmiyor, 100 altın eksikSonra 900, 899 ve 0 ile de dene.
İpucu 1
İki kılıcın toplam fiyatını önce bir değişkene koy: const toplamFiyat = kilicFiyati * 2. Koşul şu soruyu sorsun: altın bu fiyata yetiyor mu?
İpucu 2
"Yetiyor" demek "altın fiyattan az değil" demek; tam 900 altınla da alabilmelisin. Hangi işaret?
İpucu 3
Eksik miktarı da ayrı bir değişkende hesapla: const eksik = toplamFiyat - altin. Hesabı metnin içinde parantezsiz yaparsan ("Altının yetmiyor, " + toplamFiyat - altin + " altın eksik") ekranda yalnızca NaN altın eksik görürsün; nedenini Ders 9'da öğreneceksin.
Çözümü göster
const kilicFiyati = 450let altin = 1000const toplamFiyat = kilicFiyati * 2if (altin >= toplamFiyat) { altin = altin - toplamFiyat console.log("2 kılıç aldın, kalan altın: " + altin)} else { const eksik = toplamFiyat - altin console.log("Altının yetmiyor, " + eksik + " altın eksik")}2 kılıç aldın, kalan altın: 100Sınır denemesi: 900 → 2 kılıç aldın, kalan altın: 0 (tam yetiyor; > yazsaydın burada yanlış karar verirdi). 899 → Altının yetmiyor, 1 altın eksik. 0 → Altının yetmiyor, 900 altın eksik. Altın artık hiçbir değerde eksiye düşmüyor.
Hata avı: yetenek
Aşağıdaki program bir yetenek kullanmaya çalışıyor. Mana, yeteneğin bedeline yetiyorsa (bedelden az değilse) yeteneği kullanıp manadan düşmeli; yetmiyorsa Mana yetmiyor demeli. Programda üç hata var. İlk ikisini hata mesajlarını okuyarak bul. Üçüncüsünün mesajı yok; onu çıktıya bakarak ve sınır değerleriyle deneyerek yakalayacaksın.
let mana = 40const yetenekBedeli = 50If (mana = yetenekBedeli) { mana = mana - yetenekBedeli console.log("Yeteneği kullandın")else { console.log("Mana yetmiyor")}console.log("Kalan mana: " + mana)C:\kod\ogren\ders2.js:3If (mana = yetenekBedeli) { ^ SyntaxError: Unexpected token '{' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0Hepsini düzeltince mana 40 iken çıktı şu olmalı:
Mana yetmiyorKalan mana: 40İpucu 1
İlk mesaj 3. satırdaki { işaretini gösteriyor ama sorun satırın başında. Anahtar sözcüğün harflerine bak.
İpucu 2
İkinci mesaj Unexpected token 'else' olacak. else'ten önce ne eksik?
İpucu 3
Program artık hatasız çalışıyor ama 40 manayla 50 manalık yeteneği kullanabildin ve mana 0 oldu. Koşulun içindeki işaret bir soru mu soruyor, yoksa bir şey mi koyuyor? "Az değilse" hangi işaret?
Çözümü göster
let mana = 40const yetenekBedeli = 50if (mana >= yetenekBedeli) { mana = mana - yetenekBedeli console.log("Yeteneği kullandın")} else { console.log("Mana yetmiyor")}console.log("Kalan mana: " + mana)Mana yetmiyorKalan mana: 40Sırasıyla: If → if (SyntaxError: Unexpected token '{'); else'ten önce eksik } (SyntaxError: Unexpected token 'else'); koşuldaki tek = → >=. Üçüncüsünün mesajı yoktu: düzeltmeden önce program her manada Yeteneği kullandın yazıp manayı 0 yapıyordu.
Sınır denemesi: 49 → Mana yetmiyor; 50 → Yeteneği kullandın ve Kalan mana: 0; 51 → Kalan mana: 1. Tek = işaretini === yaptıysan 40'ta doğru görünür ama 51'de Mana yetmiyor der: "yetiyor" eşit olmak değil, az olmamak demek.
TFT faizi
TFT'de her turda, elindeki her 10 altın için 1 altın faiz kazanırsın; ama faiz en fazla 5 olabilir. Yani 47 altın 4 faiz getirir, 50 altın da 80 altın da 5 getirir.
altin adında bir değişken oluştur, faizi hesapla ve şunu yazdır (altin 47 iken):
Altın: 47, faiz: 4Faizi elle yazmak yok, JavaScript hesaplasın. Programını 0, 9, 10, 49, 50, 51 ve 80 ile dene.
İpucu 1
"Her 10 altın için 1" demek, altını 10'a bölüp küsuratı atmak demek. Ders 1'deki altın paylaşımı görevinde küsuratı % ile nasıl attığını hatırla.
İpucu 2
(altin - altin % 10) / 10 hesabı 47 için 4, 80 için 8 verir. 8 fazla: üst sınırı bir if ile uygula.
İpucu 3
Faiz değişebileceği için onu let ile oluştur. faiz 5'ten büyükse onu 5 yap. Bu if'in else'e ihtiyacı yok: faiz 5 ya da daha azsa olduğu gibi kalır.
Çözümü göster
const altin = 47let faiz = (altin - altin % 10) / 10if (faiz > 5) { faiz = 5}console.log("Altın: " + altin + ", faiz: " + faiz)Altın: 47, faiz: 4Sınır denemesi: 0 → 0, 9 → 0, 10 → 1, 49 → 4, 50 → 5, 51 → 5, 80 → 5. if olmasa 80 altın 8 faiz getirirdi. Bu programda iki ayrı sınır var: 10'un katları (faiz bir artar) ve 50 (faiz tavana ulaşır). İyi bir deneme ikisini de yoklar.
Kendini sına
Soru 1
Bu program ne yazar?
console.log(10 >= 10)console.log(7 !== 7)console.log("7" === 7)Cevabı göster
true, false, false. 10, 10'a eşit olduğu için "büyük ya da eşit mi?" sorusunun cevabı evet. 7, 7'den farklı değil; !== "farklı mı?" diye sorduğu için cevap hayır. Son satırda biri metin, öbürü sayı; === türe de baktığı için eşit değiller.
Soru 2
Hangi satırlar ekrana gelir?
let hp = 30if (hp < 30) { console.log("A")} else { console.log("B")}console.log("C")Cevabı göster
B ve C. 30 < 30 sorusunun cevabı false, bu yüzden else bloğu çalışır. C yazan satır if/else'in dışında olduğu için her durumda çalışır. Tam sınırda olduğun için tuzaklı bir soruydu: koşul hp <= 30 olsaydı A ve C yazardı.
Soru 3
Bu program iki satır yazıyor. Hangileri?
let hp = 50if (hp = 100) { console.log("Canın dolu")} else { console.log("Canın dolu değil")}console.log(hp)Cevabı göster
Canın dolu ve 100. Koşulda tek = var: soru sorulmadı, hp kutusuna 100 kondu. JavaScript koşulda 0 dışındaki sayıları true sayar, bu yüzden if bloğu çalıştı ve can gerçekten 100 oldu. Doğrusu if (hp === 100); o zaman Canın dolu değil ve 50 yazardı.
Soru 4
Mesajı oku: hata hangi satırda ve ne eksik?
C:\kod\ogren\ders2.js:6else {^^^^ SyntaxError: Unexpected token 'else'Cevabı göster
Hata 6. satırda, else sözcüğünde. else'ten önce if bloğu kapanmamış: } eksik. Doğrusu } else {. Bu bir SyntaxError olduğu için program hiç başlamadı; 6. satırdan önceki satırlar da çalışmadı.
Soru 5
Hangi değerlerle denersin?
Kural: "Seviye 18'e ulaşınca ekrana En yüksek seviyedesin yaz." Arkadaşın if (seviye > 18) yazmış, 5 ve 10 ile denemiş ve sorun görmemiş. Sen hangi değerlerle denersin? Hatayı hangisi yakalar?
Cevabı göster
Sınırın kendisi ve iki yanı: 17, 18, 19. Hatayı 18 yakalar: seviye tam 18 iken 18 > 18 sorusunun cevabı false, yani program en yüksek seviyede olduğunu söylemez. Doğrusu seviye >= 18. 5 ve 10 sınırdan uzak oldukları için bu hatayı hiçbir zaman göstermez.
Soru 6
Bu program hp 60 iken sorunsuz çalışıyor, 0 iken hata veriyor. Neden?
const sampiyon = "Garen"let hp = 60if (hp > 0) { console.log(sampiyon + " savaşıyor")} else { console.log(sampiyn + " öldü")}Cevabı göster
6. satırda sampiyn yanlış yazılmış. hp 60 iken koşul true, else bloğu hiç çalışmaz ve JavaScript o adı hiç aramaz. hp 0 olunca else bloğu çalışır ve ReferenceError: sampiyn is not defined çıkar. ReferenceError ve TypeError ancak hatalı satır çalışınca ortaya çıkar; bu yüzden her bloğu en az bir kez çalıştıracak değerlerle dene.
Soru 7
"10" == 10 ve "10" === 10 ne verir? Hangisini kullanmalısın?
Cevabı göster
true ve false. == önce metni sayıya çevirip öyle karşılaştırır; === türe de bakar ve metinle sayıyı eşit saymaz. Her zaman === (ve !==) kullan.
Kayıt noktası
Ders 1'de bu klasörde Git'i başlattın (git init); o iş bir klasörde yalnızca bir kez yapılır. Bundan sonra her dersin sonunda iki komut yeter. VS Code terminalinde, C:\kod\ogren klasöründeyken:
Bir sonraki derste ikiden fazla seçenek arasında karar vermeyi (else if), koşulları "ve", "veya" ile birleştirmeyi ve tekrar eden kodu fonksiyonlarda toplamayı öğreneceksin.