ou zaman ayn bir sra ile tekrar yapma ihtiyac duyulabilirsiniz.
rnein bir listede bulunan rnlerin sra ile ktsn almak. Veya ayn kodu 1-10a kadar olan saylar iin altrmak.
Dng ayn kod paracnn birden fazla defa altrlmasna denir.
while dngs
while dngs aadaki gibi bir yazma sahiptir:
while (koul) {
// kod
// veya dngnn gvdesi
}
koul doru iken(while), dng gvdesinde bulunan kod altrlr.
rnein, aadaki kod i < 3 iken alr.
let i = 0;
while (i < 3) { // nce 0, sonra 1, sonra 2
alert( i );
i++;
}
Dngnn gvdesinde bulunan kodun her almasna tekerrr(iteration) denir. Yukardaki rnekte gvde 3 defa tekerrr etmitir.
Eer i++ gibi bir kod olmasayd, teoride kod sonsuza kadar devam ederdi. Pratikte ise taraycnz bu kodun uzun sre almasn engeller, sunucu tabanl JavaScript yazdnzda ise bu ilem durdurulur.
Sadece karlatrma deil, bir ifade veya deiken koul olabilir. While dngs tarafndan alnan tm ifadeler booleana dntrlr.
rnein, while(i != 0 ) while(i)'de olabilir.
let i = 3;
while (i) { // i 0 olduunda koul `yanl` olur ve dng biter.
alert( i );
i--;
}
Eer dng gvdesi tek satr ise ssl parantezi yazmayabilirsiniz. {..}:
let i = 3;
while (i) alert(i--);
dowhile dngs
do..while dngs kullanarak koul kontroln sonda yapmak mmkndr.
do {
// dng gvdesi
} while (condition);
Dng nce gvdeyi altrr, sonra koul kontrol yapar ve eer doruysa tekrar dng gvdesini altrr.
rnein:
let i = 0;
do {
alert( i );
i++;
} while (i < 3);
Bu ekilde dng yazm ok nadir olarak kullanlr. Kullanlmasnn en nemli amac en azndan bir defa ne olursa olsun gvdenin altrlma istenmesidir. Genelde while(..){} ekli tercih edilir.
for dngs
for dngs en fazla kullanlan dngdr.
Aadaki ekilde kullanma sahiptir:
for (bala; koul; adm) {
// ... dng gvdesi ...
}
rnekler zerinden incenecek olursa. Aadaki dng alert(i) yi i 0 dan 3 olana kadar altrr.(3 dahil deil)
for (let i = 0; i < 3; i++) { // shows 0, then 1, then 2
alert(i);
}
Blm blm inceleyecek olursak
| blm | ||
|---|---|---|
| bala | i = 0 |
Dngye girildiinde alr. |
| koul | i < 3 |
Her tekerrrden nce alr, eer yanl ise dng durur. |
| adm | i++ |
Gvdenin tekerrr etmesinden sonra fakat kouldan nce alr |
| gvde | alert(i) |
koul doru olduu srece durmadan alr |
Genel dng algoritmas aadaki gibidir:
almaya balar
(if koul gvdeyi altr ve adm altr.)
(if koul gvdeyi altr ve adm altr.)
(if koul gvdeyi altr ve adm altr.)
...
Eer dngleri yeni gryorsanz, belki geri dnp bu olanlar srasyla kada yazarak takip ederseniz sizin iin daha iyi olacaktr.
Yukardaki kodda tam olarak ne oluyor peki:
// for (let i = 0; i < 3; i++) alert(i)
// almaya bala
let i = 0
// if koul gvdeyi altr ve adm altr
if (i < 3) { alert(i); i++ }
// if koul gvdeyi altr ve adm altr
if (i < 3) { alert(i); i++ }
// if koul gvdeyi altr ve adm altr
if (i < 3) { alert(i); i++ }
// ...bitir, nk imdi i=3
Saya deikeni olan i dngye girdiinde oluturulur. Buna satr aras deiken tanmlama denir. Bu deiken sadece dng ierisinde kullanlabilir.
for (let i = 0; i < 3; i++) {
alert(i); // 0, 1, 2
}
alert(i); // hata! byle bir deiken bulunamad.
Deiken tanmlamak yerine var olan da kullanlabilir:
let i = 0;
for (i = 0; i < 3; i++) { // var olan deikeni kullan
alert(i); // 0, 1, 2
}
alert(i); // 3, grnr halde nk deiken dngnn dnda tanmland.
Baz blmlerin pas geilmesi
for dngsnn her blm pas geilebilir.
rnein balang blmne ihtiya yoksa pas geilebilir.
rnein:
let i = 0; // i'yi tanmlanp 0 deeri atand
for (; i < 3; i++) { // "balang"'a ihtiya yok
alert( i ); // 0, 1, 2
}
basamak bilgisini silmek de mmkn:
let i = 0;
for (; i < 3;) {
alert( i++ );
}
Dng while(i<3) ile ayn oldu.
Aslnda her eyi silebiliriz:
for (;;) {
// sonsuz dng
}
Dikkat ederseniz for dngs yazarken noktal virgller ; yazlmaldr, aksi halde yazm hatas verir.
Dngy krma
Normalde dngler koul yanl olduunda biter.
Fakat baz durumlarda bu dng krlabilir ( break ).
rnein, kullancdan bir dizi say girmesini istediniz eer bo bir deer girerse dngy krabilirsiniz.
let toplam = 0;
while (true) {
let deger = +prompt("Bir say giriniz", '');
if (!deger) break; // (*)
toplam += deger;
}
alert( 'Toplam: ' + toplam );
break talimat (*) satrnda grld zere. Eer kullanc bo deer girerse dorudan dng durur ve dngden sonraki ilk satra atlar. Yani alert alr.
Sonsuz dng + break birlikte kullanldnda balangta koul kontrol edilmese de olur ama dng gvdesinde veya sonunda kontrol edilmesi gerekir denen dngler iin gzel bir birliktelik oluturur. Bu dng ierisinde birok defa koul kullanlarak dng krlabilir.
Bir sonraki tekerrre geme
continue, break in daha hafif versiyonudur. Dngy tamamen krmaz da zorla bir sonraki tekerrre geer(tabi koul salanyorsa)
O anda tekrar eden deer ile iimiz bitti ve bir sonraki tekrar gemek istendiinde continue kullanlr.
for (let i = 0; i < 10; i++) {
// Eer 2'ye blnebiliyorsa bir sonraki adma atlar.
if (i % 2 == 0) continue;
alert(i); // ekranda 1, 3, 5, 7, 9 deerleri gsterilir.
}
i nin ift deerleri iin dng gvdesi durdurulur, sonraki adma geilir. Bundan dolay alert sadece tek deerler iin alr.
continue talimat dng saysnn azalmasna yardmc olur.Tek deerler gsteren dng aadaki gibi de yazlabilir:
for (let i = 0; i < 10; i++) {
if (i % 2) {
alert( i );
}
}
Teknik asndan birbiri ile ayndrlar. Her zaman continue blounun yerine if kullanabiliriz.
Tabi bunun yan etkisi dng gvdesi iinde bir tane daha if kullanarak okunabilirlii drmektir.
break/continute talimatlar '?' ile kullanlamazlar
rnein:
if (i > 5) {
alert(i);
} else {
continue;
}
Yukardaki dng ? ile yazlacak olursa:
(i > 5) ? alert(i) : continue; // `continue` burada kullanlamaz!!!
sonrasnda almay durdurur. Byle kodlar yazm hatas verir.
Bu da '?' iaretini if yerine kullanmamak iin ayr bir neden.
break/continue iin etiket tanmlanmas ( Label )
Bazen birden fazla dng iinden tek bir break ile klma ihtiyac duyulabilir.
rnein aadaki kodda dng i ve j kordinatlarn ekranda gsterir:
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let deger = prompt(`Kordinattaki deer (${i},${j})`, '');
// Burada dngden kmak istersem ne yapmalym?
}
}
alert('Bitti!');
Eer kullanc iptale basarsa dng iptal edilmelidir.
Normalde ierideki dng iin degere deer atadktan sonra duruma gre iteki dng krlabilir. Fakat bu yeterli deildir. Bu gibi durumlarda Labels veya etiket ile sorun zlebilir.
etiket dngden nce bir kolon ile dngy tanmlamak iin kullanlr.
etiketAdi: for (...) {
...
}
break <etiketAdi> cmlesi bu etiketin olduu yeri krar.
Aadaki gibi:
ust_dongu: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let giris = prompt(`Kordinattaki deer (${i},${j})`, '');
// Eer iptal edildi veya bo bir deer girildiyse dardaki dngy de kr.
if (!giris) break ust_dongu; // (*)
// deer ile bir eyler yap.
}
}
alert('Bitti!');
Yukardaki kodda break ust_dongu admna gelirse ste doru ust_dongu aranr ve bulunduu yerde krlr.
Bylece kontrol dorudan (*), alert('Bitti!')ye geer.
Etiketi baka bir satra geirmekte mmkndr.
ust_dongu:
for (let i = 0; i < 3; i++) { ... }
continue talimat da etiket ile kullanlabilir. Bu durumda etiketin yazl olduu yere atlar.
Etiketler ile kodun herhangi bir yerine atlamak mmkn deildir.
rnein aadaki kod almaz.
break etiket; // etikete atlar deil mi?.
etiket: for (...)
break/continue sadece dngnn ierisinde alabilir, ve doal olarak etiketler de st tarafa yazlmaldrlar.
zet
Bu konuda 3 farkl dng ilendi:
whileHer tekerrrden nce koul kontrol edilirdo..whileKoul tekerrrden sonra kontrol edilir.for (;;)Her tekerrrden nce koul kontrol edilir. Farkl seenekler mevcuttur.
Sonsuz dng yapmak iin genelde while(true) kullanlr. Byle dngler de dierleri gibi break talimatyla krlabilir.
Eer o anki tekerrr ile iimiz bitti ve bir sonrakine gemek istiyorsanz continue kullanmanz lazm.
break/continue ile dngden nce yazlan etikete atlamak veya st dngy krmak mmkndr.
Yorumlar
<code>kullannz, birka satr eklemek iin ise<pre>kullann. Eer 10 satrdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)