17 Nisan 2022

"switch" cümleleri

Türkçe olarak buradaki anlamıyla koşullu ifade demektir.

Switch cümleleri if cümleleri haline de getirilebilirler.

Daha açıklayıcı ve değerleri birçok farklı şekilde karşılaştırabilir.

Yazım

Switch bir veya birden fazla case bloğu içermelidir. İsteğe bağlı olarak default bloğu kullanılabilir. Yazımı aşağıdaki gibidir.

switch(x) {
  case 'deger1':  // if (x === 'deger1')
    ...
    [break]

  case 'deger2':  // if (x === 'deger2')
    ...
    [break]

  default:
    ...
    [break]
}
  • x değeri sıkı eşitlik ile kontrol edildi. ( deger1) sonra da deger2

  • Eğer eşitlik bulunursa en yakın break olan yere kadar çalışmaya devam eder. Eğer break yoksa döngüyü kıramayacağından dolayı switch sonuna kadar çalışır.

  • Eğer hiçbir eşitlik sağlanamazsa default içinde olan kod çalışır.

Örnek

Aşağıda bulunan örnekte çalışacak case bloğu vurgulanmıştır.

let a = 2 + 2;

switch (a) {
  case 3:
    alert( 'Çok kısa' );
    break;
  case 4:
    alert( 'Kesinlikle!' );
    break;
  case 5:
    alert( 'Çok büyük' );
    break;
  default:
    alert( "Böyle bir değeri bilmiyorum." );
}

Başlangıçta switch cümlesi a değişkenini ilk önce 3 case’i ile karşılaştırır. Bu karşılaştırma yanlış olduğundan ikinciye geçer.

4 ise eşitliği sağlar 4den itibaren en yakın breake kadar olan bölüm çalışır.

Eğer break konulmazsa sonraki case de hiçbir kontrol olmadan çalışır

break olmadan yazılmış hali:

let a = 2 + 2;

switch (a) {
  case 3:
    alert( 'Çok kısa' );
  case 4:
    alert( 'Kesinlikle!' );
  case 5:
    alert( 'Çok büyük' );
  default:
    alert( "Böyle bir değeri bilmiyorum." );
}

Bu döngü çalıştırıldığında ekranda sıralı şekilde uyarılar göreceksiniz.

alert( 'Kesinlikle!' );
alert( 'Çok büyük' );
alert( "Böyle bir değeri bilmiyorum." );
Her türli ifade switch/case olabilir.

Örneğin:

let a = "1";
let b = 0;

switch (+a) {
  case b + 1:
    alert("Çalışır çünkü a+1 = b+1");
    break;

  default:
    alert("Burası çalışmaz");
}

+a 1 değeri döndürür. case işleminde b+1 ile karşılaştırıldığında sonuç doğru olduğundan içerideki alert çalışır.

“case”'leri gruplama

Gövdesinde aynı kodu çalıştıran birden fazla case gruplanabilir.

Örneğin, diyelim ki case 3 ve case 5 için aynı kodu çalıştırmak istedik:

let a = 2 + 2;

switch (a) {
  case 4:
    alert('Doğru!');
    break;

  case 3:                    // (*) iki "case" gruplandı
  case 5:
    alert('Yanlış!');
    alert("Neden matematik dersi almıyorsun?");
    break;

  default:
    alert('Sonuç garip. Gerçekten!');
}

3 ve 5 aynı mesajı gösterecek.

Aslında “gruplama” switch/case’in break olmadan çalıştırılmış halidir. Yan etki de denebilir. case 3 (*)'dan başlar ve arada break olmadığından case 5 ile devam eder.

Tipler önemlidir

Başta da söylenildiği gibi değişken eşitlikleri her zaman sıkı olarak kontrol edilir. Bundan dolayı değerler karşılaştırılırken aynı tipte olmasına dikkat edilmesi gerekir.

Örneğin, aşağıdaki kodu göz önüne alırsanız:

let arg = prompt("Bir değer giriniz?")
switch (arg) {
  case '0':
  case '1':
    alert( 'Bir veya 2' );
    break;

  case '2':
    alert( '2' );
    break;

  case 3:
    alert( 'hiçbir zaman çalışmaz!' );
    break;
  default:
    alert( 'Bilinmeyen bir değer' )
}
  1. 0 ve 1 değerleri için ilk alert çalışır.
  2. 2 değeri için ikinci alert çalışır.
  3. prompt her zaman karakter dizisi döndüreceğinden dolayı kontrol eğer 3 şeklinde yapılsaydı bu durumda ekrana mesaj çıkacaktı. Fakat kontrol sayı olan 3 ile yapıldığından dolayı bu ölü koddur ve hiçbir zaman çalışmaz. Bunun yerine default kodu çalışacaktır.

Görevler

önem: 5

Aşağıdaki kodu if..else şekline çeviriniz.

switch (tarayici) {
  case 'Edge':
    alert( "Edge browser kullanıyorsun" );
    break;

  case 'Chrome':
  case 'Firefox':
  case 'Safari':
  case 'Opera':
    alert( 'Tamam bunları destekliyoruz.' );
    break;

  default:
    alert( 'Umarım sayfanız güzel görünüyordur' );
}

switch cümlesini bire bir karşılamak için if sıkı karşılaştırma === yapmalıdır.

Şu anki durumuyla '==' karakter karşılaştırma da aynı sonucu verecektir.

if(tarayici == 'Edge') {
  alert("Edge browser kullanıyorsun");
} else if (tarayici == 'Chrome'
 || tarayici == 'Firefox'
 || tarayici == 'Safari'
 || tarayici == 'Opera') {
  alert( 'Tamam bunları destekliyoruz.' );
} else {
  alert( 'Umarım sayfanız güzel görünüyordur' );
}

Dikkat edecek olursanız tarayici=='Chrome' || tarayici == 'Firefox' birçok satıra ayrılmış. Bunun nedeni daha kolay okunabilirlikten dolayıdır.

switch hali daha temiz ve açıklayıcı duruyor.

önem: 4

Aşağıdaki kodu switch cümlesine çeviriniz

let a = +prompt('a?', '');

if (a == 0) {
  alert( 0 );
}
if (a == 1) {
  alert( 1 );
}

if (a == 2 || a == 3) {
  alert( '2,3' );
}

İlk ikisi iki tane casee dönüşür. Üçüncüsü ise iki tane casee dönüşür.

let a = +prompt('a?', '');

switch (a) {
  case 0:
    alert( 0 );
    break;

  case 1:
    alert( 1 );
    break;

  case 2:
  case 3:
    alert( '2,3' );
    break;
}

Not: En altta bulunan break gerekli değildir. Fakat kodu gelecekte oluşacak değişikliklere yönelik yazarsanız daha iyi olur.

İlerde diyelim ki yeni bir case yazma ihtiyacı duydunuz örneğin case 4 ve bir öncekinde break cümlesini unuttunuz diyelim. Bu durumda case 3 ün sonunda hata olacaktır. Bu şekilde yazma bir çeşit sigortadır.

Eğitim haritası