> For the complete documentation index, see [llms.txt](https://hanuce.gitbook.io/javascript-egitimi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hanuce.gitbook.io/javascript-egitimi/donguler/for-dongusu.md).

# for Döngüsü

İşlemlerin ***belirli bir sayıda*** yinelendiği döngüdür. Bu döngü türünde bir sayaç olur ve bu sayacın ***başlama pozisyonu, bitiş pozisyonu ve artış/azalış miktarı*** döngünün başında belirtilir. Kullanım:

{% code lineNumbers="true" %}

```javascript
for (baslamaPozisyonu; bitisPozisyonu; artisAzalisMiktari) {
    //döngü kod bloğu
}
```

{% endcode %}

Örnek olarak:

{% code lineNumbers="true" %}

```javascript
for (let i = 0; i < 5; i += 1) {
    alert(i);
}
```

{% endcode %}

**`for`** döngüsünde sayaç olarak daha önce bildirilmiş bir değişkeni kullanabiliriz.

{% code lineNumbers="true" %}

```javascript
let i;
for (i = 0; i < 5; i += 1) {
    alert(i);
}
```

{% endcode %}

**`for`** döngüsünde sayaç başlama pozisyonunda da bildirilebilir. Diğerinden farkı değişkenin bellekte tutulma süresidir. Önceden bildirirseniz o kapsam süresince, **`for`** döngüsü başında bildirirseniz döngü bitene kadar bellekte yer kaplar.

{% code lineNumbers="true" %}

```javascript
for (let i = 0; i < 5; i += 1) {
    alert(i);
}
```

{% endcode %}

&#x20;**`for`** döngüsünde sayaca ait bitiş pozisyonu **`true`** olursa döngü devam eder, **`false`** olursa döngüden çıkılır.

{% code lineNumbers="true" %}

```javascript
// bitiş pozisyonu ilk kullanımda true bir sonrakinde false, tek sefer döner.
for (let i = 0; i == 0; i++) {
    alert('Merhaba');
}
//i değişkeninin ömrü bitti bellekten kaldırıldı.
```

{% endcode %}

Bu yapı sebebiyle genellikle **`<`** veya **`>`** ile bitiş pozisyonu verilir. **`==`** veya **`===`** ile verilen bitiş pozisyonları **`for`** döngüsü için mantıksız bir kullanımdır. Sonsuz döngü ve hiç dönmeyen bir döngü için şunu deneyebilirsiniz. Örnekler.

{% code lineNumbers="true" %}

```javascript
//Sonsuz Döngü
for (let i = 0; true; i++) {
    alert(i);
}
//veya sayacın bitiş pozisyonunu hep true olacak şekilde ayarlayın
for (let i = 0; i > -1; i++) {
    alert(i);
}
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//Hiç Dönmeyen Döngü
for (let i = 0; false; i++) {
    alert(i);
}
//veya sayacın bitiş pozisyonunu ilk döngüde false olacak şekilde ayarlayın
for (let i = 0; i == 2; i++) {
    alert(i);
}
//hiç döngüye girilmeden çıkıldı. i değişkeninin ömrü bitti kaldırıldı.
```

{% endcode %}

**`for`** döngüsünde sayacın artış/azalış miktarı hep artış olma zorunluluğu yoktur. Azalış miktarı olacak şekilde de verilebilir. Örnek.

{% code lineNumbers="true" %}

```javascript
for (let i = 5; i > 0; i--) {
    alert(i);
}
```

{% endcode %}

**`for`** döngüsünde sayacın artış/azalış miktarı azalış olarak da verilebilir. Örnek.

{% code lineNumbers="true" %}

```javascript
for (let i = 5; i > 0; i--) {
    alert(i);
}
```

{% endcode %}

Arış/Azalış miktarı ifadesini sayacın başlama pozisyonundan bitiş pozisyonuna götürecek bir mantıkla ifade etmeniz gerekir. Aksi takdirde sonsuz döngü oluşturmuş olursunuz.

**`for`** döngüsünde **`let`** ile deklare ettiğiniz değişken blok bittikten sonra bellekten kaldırıldığı için sonrasında tekrar deklare ederseniz herhangi bir hata almazsınız. Örnek.

{% code lineNumbers="true" %}

```javascript
for (let i = 5; i > 0; i -= 2) {
    alert(i);
}
let i = 'sayaç';
alert(i);
```

{% endcode %}

Döngüler iç içe (nested) olarak da kullanılabilir. Örnek.

{% code lineNumbers="true" %}

```javascript
for (let i = 1; i < 4; i++) {
    for (let j = 1; j < 4; j++) {
        alert(`${i}. Döngünün içindeki ${j}. Döngü`);
    } 
}
```

{% endcode %}

## Bazı Bölümleri Pas Geçme

Sayaç olarak kullanılacak değişken daha önceden bildirilmiş ve değer atanmış ise bu kısım pas geçilebilir.&#x20;

{% code lineNumbers="true" %}

```javascript
let i = 0;
for ( ; i < 3; i++) {
    alert(i);
}
```

{% endcode %}

Aynı şekilde eğer artış/azalış miktarını döngü içinde duruma göre değiştirmek istiyorsanız bu kısmı da pas geçebilirsiniz. Fakat döngü içerisinde sayacı manipüle etmezseniz sonsuz bir döngü elde edersiniz. Örnek.

{% code lineNumbers="true" %}

```javascript
for (let i = 0; i <= 10; ) {
    alert(i);
    i += 5;
}
```

{% endcode %}

Bitiş pozisyonunu da pas geçebilirsiniz. Bu şekilde sürekli **`true`** ile sonsuz bir döngü elde edersiniz. Örnek.

{% code lineNumbers="true" %}

```javascript
for (let i = 0; ; i += 5) {
    alert(i);
}
```

{% endcode %}

Hepsini pas geçerek sayaçsız ve sonsuz bir döngü elde edebilirsiniz.

{% code lineNumbers="true" %}

```javascript
for (;;) {
    alert('Sonsuz döngü');
}
```

{% endcode %}

Eğer **`for`** bloklarında tek satırlık kod yazacaksanız blok açmadan aynı satırda da yazabilirsiniz. Örnek.

{% code lineNumbers="true" %}

```javascript
for (let i = 0; i < 3; i++) alert(i);
```

{% endcode %}

## `String`'in `for` ile Yinelenmesi

**`String`** tipinin sıralanmış elemanlardan oluşması yinelenebilir bir yapı sunmaktadır. Döngülenebilir yapılar **`for`** deyiminin farklı şekilleriyle kullanılır.

**`for ... of`** yinelemesi  ile **`string`**'ler şu şekilde kullanılır. Örnek.

{% code lineNumbers="true" %}

```javascript
let str = 'Tekerrür';
for (let karakter of str) {
    alert(karakter);
}
```

{% endcode %}

**`String`**'ler ilkel (değer) tipler olduğu için **stack** bölümünde tutulurlar ve bu bölümdeki verilerin boyutu belirlidir. Bu sebeple bir parçası değiştirilemez, yani immutable'dir.

{% code lineNumbers="true" %}

```javascript
let str = 'Tekerrür';
for (let karakter of str) {
    if (karakter == 'k') {
        alert(karakter); // k harfi çıkar.
        karakter = 'ş'; // immutable, değiştirilemez.
        alert(str); // Tekerrür
    }
}
```

{% endcode %}
