Switch ile Birçok Seçenek Arasından Birini Seçmek
switch, tek bir değeri belirli sabit seçeneklerle karşılaştırmak istediğinizde işinize yarayan bir kontrol akışı yapısıdır. Aynı işi if/else if/else zinciriyle de yapabilirsiniz elbette; ama aynı değişkeni üç dört kez peş peşe kontrol ediyorsanız, switch çok daha okunaklı durur.
Temel yapısı şöyle:
Yukarıdan aşağıya okuduğumuzda olay şu: JavaScript önce day değerini alıyor, sonra her bir case etiketiyle karşılaştırıyor ve eşleşen bloğu çalıştırıyor. default ise hiçbirine uymayan durumları yakalıyor — aynı sondaki bir else gibi. Yani okuma sırası: değer → case → kod.
switch case eşleşmesi aslında nasıl çalışır?
switch, karşılaştırmayı katı eşitlikle yapar — yani === operatörüyle. Tür dönüşümü yok, "yaklaşık" eşleşme de yok. case 1: sadece 1 sayısıyla eşleşir; "1" string'iyle eşleşmez.
Burada yalnızca ikinci case eşleşiyor. switch ifadenizin bir türlü tetiklenmediğine şaşırdığınız bir an olursa, suçlu büyük ihtimalle form input'undan ya da URL parametresinden gelen bir string/number uyuşmazlığıdır.
Akışı Durduran Şey: break
İşte insanların kafasını karıştıran kısım burası. case etiketi kendi başına bir blok değil, bir atlama noktasıdır. Eşleşen bir case'e düştüğünde, yürütme satır satır ilerlemeye devam eder — bir sonraki case'in etiketinin üstünden bile geçer — ta ki break, return ya da switch'in sonuna gelene kadar.
break olmadan neler olduğuna bakın:
Eşleşme "editor" ama yine de düzenleyebilir, görüntüleyebilir ve giriş yapıldı çıktılarını alıyorsun. İşte bu switch case fallthrough davranışıdır — hiçbir şey "dur" demediği için kod, eşleşen case'den sonraki tüm case'leri sırayla çalıştırmaya devam ediyor.
break eklediğinde beklenen şekilde çalışır:
Alışkanlık haline getirin: bilerek fallthrough istemediğiniz sürece her case mutlaka break ile bitsin.
Case'leri Gruplamak İçin Bilinçli Fallthrough
Fallthrough her zaman hata değildir. break yazmamak, "bu case'lerin hepsi aynı işi yapacak" demenin temiz bir yoludur:
Üst üste yazılmış boş case etiketleri, altlarındaki bloğu paylaşır. return'den sonra break yazmaya gerek olmadığına dikkat edin — fonksiyon zaten tamamen sonlanır. Bir switch içindeki return, sonrasında gelebilecek her şeyi atlar.
Boş olmayan case'ler arasında bilinçli olarak fallthrough (case'in bir sonrakine düşmesi) istiyorsanız, sonradan kodu okuyanın "hatayı düzeltmeye" kalkmaması için mutlaka bir yorum satırı bırakın:
default Her Zaman En Sonda Olmak Zorunda Değil
Alışkanlık gereği default en alta yazılır ve okuyucuların çoğu da onu orada görmeyi bekler. Ama teknik olarak default da sıradan bir etikettir sadece — hangi case eşleşmediyse devreye girer, nerede durduğunun bir önemi yok. default'u ortaya koyar ve sonuna break eklemezsen, altında kalan bloklara sızar (fallthrough). En iyisi: default'u en sona koy, sonuna break yaz (ya da yazma, zaten arkasında bir şey kalmıyor). İleride kodu tekrar açtığında kendine teşekkür edeceksin.
Case İçinde Değişken Kapsamı
Aslında case'ler tek bir blok kapsamını paylaşır — yani tüm switch bloğu. Aynı isimli bir let veya const değişkenini iki farklı case içinde tanımlarsanız, yeniden tanımlama (redeclaration) hatası alırsınız:
switch (x) {
case 1:
let msg = "one";
break;
case 2:
let msg = "two"; // SyntaxError: Identifier 'msg' has already been declared
break;
}
Çözüm basit: her case bloğunu kendi { } süslü parantezleri içine almak:
Artık her msg kendi scope'unda yaşıyor ve çakışma da ortadan kalkıyor. Bir case bloğu bir iki satırdan fazla mantık içerdiğinde bunu aklında tutmakta fayda var.
switch vs if/else: hangisini ne zaman kullanmalı?
switch yapısı, tek bir değeri birçok sabit seçenekle karşılaştırırken parlıyor: HTTP kodları, Redux action tipleri, komut isimleri, enum benzeri string'ler. Karşılaştırılan değer en başta bir kez görünür ve okuyucunun gözü case etiketlerini adeta bir içindekiler tablosu gibi kolayca tarar.
Şu durumlarda ise if/else daha iyi bir tercih:
- Aralık karşılaştırması yapıyorsan (
score >= 90,score >= 75). - Koşullar farklı değişkenleri ya da boolean ifadeleri içeriyorsa.
- Gevşek eşitlik veya özel karşılaştırma mantığı istiyorsan (
switchher zaman===kullanır).
İlk desen için modern ve yaygın bir alternatif de nesneyle eşleme (object lookup) kullanmaktır:
Dokuz satırlık bir switch yerine üç satır. Case'lerin içi gerçek bir mantık yerine sadece veri eşlemesinden ibaretse, bir nesne (ya da Map) genelde çok daha okunaklı olur. switch'i her case'in gerçekten bir iş yaptığı durumlar için sakla.
Sırada: for Döngüleri
switch, tek bir kararı birçok seçenekle karşılaştırmak için biçilmiş kaftan. Kontrol akışının bir sonraki parçasıysa tekrar — yani aynı kod bloğunu defalarca çalıştırmak. İşte tam bu noktada for döngüleri devreye giriyor. Bir sonraki konumuz bu.
Sıkça Sorulan Sorular
JavaScript'te switch ifadesi nasıl çalışır?
switch, tek bir değeri bir dizi case etiketiyle strict eşitlik (===) kullanarak karşılaştırır. Eşleşen ilk case'i bulduğunda o bloğun kodunu çalıştırır ve bir break ile karşılaşana ya da blok bitene kadar devam eder. Hiçbir case eşleşmezse opsiyonel default bloğu devreye girer.
JavaScript switch'te fallthrough nedir?
Bir case bloğu break (veya return) ile bitmiyorsa, etiketi eşleşmese bile bir sonraki case'in koduna "düşerek" çalışmaya devam eder. Aynı mantığı paylaşan case'leri gruplamak için işe yarayabilir ama çoğu zaman gözden kaçan bir buga dönüşür. Bilinçli olarak fallthrough istemiyorsanız her case'i break ile kapatın.
if/else yerine ne zaman switch kullanmalıyım?
Tek bir değeri birden fazla sabit seçenekle karşılaştırıyorsanız — HTTP durum kodları, action type'ları, string komutlar gibi — switch daha temiz durur. Aralık kontrolü, birden fazla değişken veya karmaşık boolean ifadeler söz konusuysa if/else daha uygundur. Ayrıca switch strict eşitlik kullandığı için case '1''in sayı olan 1 ile eşleşmeyeceğini unutmayın.