ÃoÄu zaman aynı bir sıra ile tekrar yapma ihtiyacı duyulabilirsiniz.
ÃrneÄin bir listede bulunan ürünlerin sıra ile çıktısını almak. Veya aynı kodu 1-10âa kadar olan sayılar için çalıÅtırmak.
Döngü aynı kod parçacıÄının birden fazla defa çalıÅtırılmasına denir.
âwhileâ döngüsü
while döngüsü aÅaÄıdaki gibi bir yazıma sahiptir:
while (koÅul) {
// kod
// veya döngünün gövdesi
}
koÅul doÄru iken(while), döngü gövdesinde bulunan kod çalıÅtırılır.
ÃrneÄin, aÅaÄıdaki kod i < 3 iken çalıÅır.
let i = 0;
while (i < 3) { // önce 0, sonra 1, sonra 2
alert( i );
i++;
}
Döngünün gövdesinde bulunan kodun her çalıÅmasına tekerrür(iteration) denir. Yukarıdaki örnekte gövde 3 defa tekerrür etmiÅtir.
EÄer i++ gibi bir kod olmasaydı, teoride kod sonsuza kadar devam ederdi. Pratikte ise tarayıcınız bu kodun uzun süre çalıÅmasını engeller, sunucu tabanlı JavaScript yazdıÄınızda ise bu iÅlem durdurulur.
Sadece karÅılaÅtırma deÄil, bir ifade veya deÄiÅken koÅul olabilir. While döngüsü tarafından alınan tüm ifadeler booleanâa dönüÅtürülür.
ÃrneÄin, while(i != 0 ) while(i)'de olabilir.
let i = 3;
while (i) { // i 0 olduÄunda koÅul `yanlıÅ` olur ve döngü biter.
alert( i );
i--;
}
EÄer döngü gövdesi tek satır ise süslü parantezi yazmayabilirsiniz. {..}:
let i = 3;
while (i) alert(i--);
âdoâ¦whileâ döngüsü
do..while döngüsü kullanarak koÅul kontrolünü sonda yapmak mümkündür.
do {
// döngü gövdesi
} while (condition);
Döngü önce gövdeyi çalıÅtırır, sonra koÅul kontrolü yapar ve eÄer doÄruysa tekrar döngü gövdesini çalıÅtırır.
ÃrneÄin:
let i = 0;
do {
alert( i );
i++;
} while (i < 3);
Bu Åekilde döngü yazımı çok nadir olarak kullanılır. Kullanılmasının en önemli amacı en azından bir defa ne olursa olsun gövdenin çalıÅtırılma istenmesidir. Genelde while(..){} Åekli tercih edilir.
âforâ döngüsü
for döngüsü en fazla kullanılan döngüdür.
AÅaÄıdaki Åekilde kullanıma sahiptir:
for (baÅla; koÅul; adım) {
// ... döngü gövdesi ...
}
Ãrnekler üzerinden incenecek olursa. AÅaÄıdaki döngü alert(i) yi i 0 dan 3 olana kadar çalıÅtırır.(3 dahil deÄil)
for (let i = 0; i < 3; i++) { // shows 0, then 1, then 2
alert(i);
}
Bölüm bölüm inceleyecek olursak
| bölüm | ||
|---|---|---|
| baÅla | i = 0 |
Döngüye girildiÄinde çalıÅır. |
| koÅul | i < 3 |
Her tekerrürden önce çalıÅır, eÄer yanlıŠise döngü durur. |
| adım | i++ |
Gövdenin tekerrür etmesinden sonra fakat koÅuldan önce çalıÅır |
| gövde | alert(i) |
koÅul doÄru olduÄu sürece durmadan çalıÅır |
Genel döngü algoritması aÅaÄıdaki gibidir:
ÃalıÅmaya baÅlar
â (if koÅul â gövdeyi çalıÅtır ve adımı çalıÅtır.)
â (if koÅul â gövdeyi çalıÅtır ve adımı çalıÅtır.)
â (if koÅul â gövdeyi çalıÅtır ve adımı çalıÅtır.)
â ...
EÄer döngüleri yeni görüyorsanız, belki geri dönüp bu olanları sırasıyla kaÄıda yazarak takip ederseniz sizin için daha iyi olacaktır.
Yukarıdaki kodda tam olarak ne oluyor peki:
// for (let i = 0; i < 3; i++) alert(i)
// ÃalıÅmaya baÅla
let i = 0
// if koÅul â gövdeyi çalıÅtır ve adımı çalıÅtır
if (i < 3) { alert(i); i++ }
// if koÅul â gövdeyi çalıÅtır ve adımı çalıÅtır
if (i < 3) { alert(i); i++ }
// if koÅul â gövdeyi çalıÅtır ve adımı çalıÅtır
if (i < 3) { alert(i); i++ }
// ...bitir, çünkü Åimdi i=3
Sayaç deÄiÅkeni olan i döngüye girdiÄinde oluÅturulur. Buna âsatır arasıâ deÄiÅken tanımlama denir. Bu deÄiÅken sadece döngü içerisinde kullanılabilir.
for (let i = 0; i < 3; i++) {
alert(i); // 0, 1, 2
}
alert(i); // hata! böyle bir deÄiÅken bulunamadı.
DeÄiÅken tanımlamak yerine var olan da kullanılabilir:
let i = 0;
for (i = 0; i < 3; i++) { // var olan deÄiÅkeni kullan
alert(i); // 0, 1, 2
}
alert(i); // 3, görünür halde çünkü deÄiÅken döngünün dıÅında tanımlandı.
Bazı bölümlerin pas geçilmesi
for döngüsünün her bölümü pas geçilebilir.
ÃrneÄin baÅlangıç bölümüne ihtiyaç yoksa pas geçilebilir.
ÃrneÄin:
let i = 0; // i'yi tanımlanıp 0 deÄeri atandı
for (; i < 3; i++) { // "baÅlangıç"'a ihtiyaç yok
alert( i ); // 0, 1, 2
}
basamak bilgisini silmek de mümkün:
let i = 0;
for (; i < 3;) {
alert( i++ );
}
Döngü while(i<3) ile aynı oldu.
Aslında her Åeyi silebiliriz:
for (;;) {
// sonsuz döngü
}
Dikkat ederseniz for döngüsü yazarken noktalı virgüller ; yazılmalıdır, aksi halde yazım hatası verir.
Döngüyü kırma
Normalde döngüler koÅul yanlıŠolduÄunda biter.
Fakat bazı durumlarda bu döngü kırılabilir ( break ).
ÃrneÄin, kullanıcıdan bir dizi sayı girmesini istediniz eÄer boÅ bir deÄer girerse döngüyü kırabilirsiniz.
let toplam = 0;
while (true) {
let deger = +prompt("Bir sayı giriniz", '');
if (!deger) break; // (*)
toplam += deger;
}
alert( 'Toplam: ' + toplam );
break talimatı (*) satırında görüldüÄü üzere. EÄer kullanıcı boÅ deÄer girerse doÄrudan döngü durur ve döngüden sonraki ilk satıra atlar. Yani alert çalıÅır.
âSonsuz döngüâ + break birlikte kullanıldıÄında baÅlangıçta koÅul kontrol edilmese de olur ama döngü gövdesinde veya sonunda kontrol edilmesi gerekir denen döngüler için güzel bir birliktelik oluÅturur. Bu döngü içerisinde birçok defa koÅul kullanılarak döngü kırılabilir.
Bir sonraki tekerrüre geçme
continue, break in daha hafif versiyonudur. Döngüyü tamamen kırmaz da zorla bir sonraki tekerrüre geçer(tabi koÅul saÄlanıyorsa)
O anda tekrar eden deÄer ile iÅimiz bitti ve bir sonraki tekrar geçmek istendiÄinde continue kullanılır.
for (let i = 0; i < 10; i++) {
// EÄer 2'ye bölünebiliyorsa bir sonraki adıma atlar.
if (i % 2 == 0) continue;
alert(i); // ekranda 1, 3, 5, 7, 9 deÄerleri gösterilir.
}
i nin çift deÄerleri için döngü gövdesi durdurulur, sonraki adıma geçilir. Bundan dolayı alert sadece tek deÄerler için çalıÅır.
continue talimatı döngü sayısının azalmasına yardımcı olur.Tek deÄerler gösteren döngü aÅaÄıdaki gibi de yazılabilir:
for (let i = 0; i < 10; i++) {
if (i % 2) {
alert( i );
}
}
Teknik açısından birbiri ile aynıdırlar. Her zaman continue bloÄunun yerine if kullanabiliriz.
Tabi bunun yan etkisi döngü gövdesi içinde bir tane daha if kullanarak okunabilirliÄi düÅürmektir.
break/continute talimatları '?' ile kullanılamazlar
ÃrneÄin:
if (i > 5) {
alert(i);
} else {
continue;
}
Yukarıdaki döngü ? ile yazılacak olursa:
(i > 5) ? alert(i) : continue; // `continue` burada kullanılamaz!!!
⦠sonrasında çalıÅmayı durdurur. Böyle kodlar yazım hatası verir.
Bu da '?' iÅaretini if yerine kullanmamak için ayrı bir neden.
break/continue için etiket tanımlanması ( Label )
Bazen birden fazla döngü içinden tek bir break ile çıkılma ihtiyacı duyulabilir.
ÃrneÄin aÅaÄıdaki kodda döngü i ve j kordinatlarını ekranda gösterir:
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let deger = prompt(`Kordinattaki deÄer (${i},${j})`, '');
// Burada döngüden çıkmak istersem ne yapmalıyım?
}
}
alert('Bitti!');
EÄer kullanıcı iptale basarsa döngü iptal edilmelidir.
Normalde içerideki döngü için degerâe deÄer atadıktan sonra duruma göre içteki döngü kırılabilir. Fakat bu yeterli deÄildir. Bu gibi durumlarda Labels veya etiket ile sorun çözülebilir.
etiket döngüden önce bir kolon ile döngüyü tanımlamak için kullanılır.
etiketAdi: for (...) {
...
}
break <etiketAdi> cümlesi bu etiketin olduÄu yeri kırar.
AÅaÄıdaki gibi:
ust_dongu: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let giris = prompt(`Kordinattaki deÄer (${i},${j})`, '');
// EÄer iptal edildi veya boÅ bir deÄer girildiyse dıÅarıdaki döngüyü de kır.
if (!giris) break ust_dongu; // (*)
// deÄer ile bir Åeyler yap.
}
}
alert('Bitti!');
Yukarıdaki kodda break ust_dongu adımına gelirse üste doÄru ust_dongu aranır ve bulunduÄu yerde kırılır.
Böylece kontrol doÄrudan (*), alert('Bitti!')ye geçer.
Etiketi baÅka bir satıra geçirmekte mümkündür.
ust_dongu:
for (let i = 0; i < 3; i++) { ... }
continue talimatı da etiket ile kullanılabilir. Bu durumda etiketin yazılı olduÄu yere atlar.
Etiketler ile kodun herhangi bir yerine atlamak mümkün deÄildir.
ÃrneÄin aÅaÄıdaki kod çalıÅmaz.
break etiket; // etikete atlar deÄil mi?.
etiket: for (...)
break/continue sadece döngünün içerisinde çalıÅabilir, ve doÄal olarak etiketler de üst tarafa yazılmalıdırlar.
Ãzet
Bu konuda 3 farklı döngü iÅlendi:
whileâ Her tekerrürden önce koÅul kontrol edilirdo..whileâ KoÅul tekerrürden sonra kontrol edilir.for (;;)â Her tekerrürden önce koÅul kontrol edilir. Farklı seçenekler mevcuttur.
Sonsuz döngü yapmak için genelde while(true) kullanılır. Böyle döngüler de diÄerleri gibi break talimatıyla kırılabilir.
EÄer o anki tekerrür ile iÅimiz bitti ve bir sonrakine geçmek istiyorsanız continue kullanmanız lazım.
break/continue ile döngüden önce yazılan etikete atlamak veya üst döngüyü kırmak mümkündür.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)