# 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hanuce.gitbook.io/javascript-egitimi/donguler/for-dongusu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
