1. Diziler ve Dizi Metodları

Diziler, birden fazla değeri sıralı bir şekilde saklamamıza olanak tanıyan veri yapılarıdır.

Dizi Oluşturma

let meyveler = ["Elma", "Armut", "Muz", "Çilek"];
console.log(meyveler[0]); // "Elma"
console.log(meyveler[2]); // "Muz"

Temel Dizi Metodları

meyveler.push("Kiraz");  // ["Elma", "Armut", "Muz", "Çilek", "Kiraz"]
meyveler.pop();          // "Kiraz" çıkarılır

// length ile son elemana erişim
console.log(meyveler[meyveler.length - 1]);

2. Objeler ve Nesne Literalleri

Objeler, anahtar-değer çiftleri şeklinde verileri saklamamıza olanak tanır.

Obje Oluşturma

let kisi = {
    isim: "Ahmet",
    yas: 30,
    meslek: "Mühendis"
};

// obje özelliklerine erişim
console.log(kisi.isim);     // "Ahmet"
console.log(kisi["yas"]);   // 30

Yeni Özellik Ekleme / Güncelleme

kisi.sehir = "İstanbul";
kisi.yas = 31;

3. Fonksiyon İfadeleri ve Ok Fonksiyonları

Fonksiyon İfadeleri

Bir fonksiyonu bir değişkene atayabiliriz:

const kareAl = function (sayi) {
    return sayi * sayi;
};

console.log(kareAl(5)); // 25

Ok Fonksiyonları (Arrow Functions)

Daha kısa fonksiyon tanımlama şekli:

const kupAl = (sayi) => {
    return sayi * sayi * sayi;
};

console.log(kupAl(3)); // 27

// Tek satırlık dönüşü olan fonksiyonlarda süslü parantezleri ve return atlanabilir:
const ikiIleCarp = sayi => sayi * 2;
console.log(ikiIleCarp(4)); // 8

Soru: Ok fonksiyonları ve normal fonksiyon ifadeleri arasında this anahtar kelimesi açısından ne fark vardır?

Ok fonksiyonları kendi this’lerini oluşturmaz — tanımlandıkları yerin this’ini miras alır. Bu, callback’lerde ve class metodlarında önemli bir davranış farkı yaratır.

4. Scope (Kapsam) ve Closure

Scope (Kapsam): Değişkenlerin erişilebilir olduğu bölgelerdir.

let a = 10; // Global Scope

function ornekFonksiyon() {
    let b = 20; // Function Scope
    console.log(a); // 10
    console.log(b); // 20
}

ornekFonksiyon();
console.log(b); // Hata: b tanımlı değil

Closure

Closure: İç içe fonksiyonlarda, iç fonksiyonun dış fonksiyonun değişkenlerine erişebilmesi durumudur.

function disFonksiyon() {
    let sayac = 0;

    function icFonksiyon() {
        sayac++;
        console.log(sayac);
    }

    return icFonksiyon;
}

const sayaciArttir = disFonksiyon();
sayaciArttir(); // 1
sayaciArttir(); // 2
sayaciArttir(); // 3

5. Yüksek Seviyeli Dizi Metodları

Diziler üzerinde daha karmaşık işlemler yapmamıza olanak tanıyan metodlar.

map — Her elemanı dönüştür

let sayilar = [1, 2, 3, 4, 5];
let kareler = sayilar.map(sayi => sayi * sayi);
console.log(kareler); // [1, 4, 9, 16, 25]

filter — Belirli koşula uyan elemanları al

let ciftSayilar = sayilar.filter(sayi => sayi % 2 === 0);
console.log(ciftSayilar); // [2, 4]

reduce — Diziyi tek bir değere indirge

let toplam = sayilar.reduce((toplam, sayi) => toplam + sayi, 0);
console.log(toplam); // 15

reduce’un ikinci argümanı (0) başlangıç değeridir. Verilmezse, dizinin ilk elemanı başlangıç değeri olarak alınır.

Pratik Sorular

Soru 1: Verilen bir dizi içindeki sayıların toplamını hesaplayan bir fonksiyon yazınız.

let dizi = [1, 2, 3, 4, 5, 6];
let toplam = dizi.reduce((a, b) => a + b, 0);
console.log(toplam); // 21

Soru 2: Bir obje dizisinde, yaşı 18’den büyük olan kişilerin isimlerini bir dizi olarak döndüren bir kod yazınız.

let kisiler = [
    { ad: "Ali", yas: 20 },
    { ad: "Ayşe", yas: 17 },
    { ad: "Mehmet", yas: 25 },
    { ad: "Fatma", yas: 16 },
    { ad: "Can", yas: 19 }
];

let yasBuyuklar = kisiler
    .filter(kisi => kisi.yas > 18)
    .map(kisi => kisi.ad);

console.log(yasBuyuklar); // ["Ali", "Mehmet", "Can"]

Soru 3: Closure yapısını kullanarak, dış fonksiyon bir mesaj alsın, iç fonksiyon bu mesajı ekrana yazdırsın.

function disFonksiyon() {
    let mesaj = "Merhaba";

    function icFonksiyon() {
        console.log(mesaj + " — mesaj yazdırıldı");
    }

    return icFonksiyon;
}

let fonksiyon = disFonksiyon();
fonksiyon();

Günün Özeti

Bugün JavaScript’te veri yapıları ve fonksiyonları daha derinlemesine inceledik:

Yarın, Gün 3’te DOM manipülasyonu ve etkinliklere geçeceğiz.