JavaScript'e Giriş
JavaScript, web sayfalarını etkileşimli hale getiren dünyanın en popüler programlama dilidir. Hem tarayıcıda (Client-side) hem de sunucuda (Node.js) çalışabilir.
JavaScript Neden Önemli?
- Etkileşim: Butonlar, animasyonlar, form kontrolleri
- Popülerlik: Tüm modern web tarayıcılarında çalışır
- Tam Yığın (Fullstack): Frontend ve Backend geliştirilebilir (Node.js)
- Zengin Ekosistem: React, Vue, Angular gibi kütüphaneler
// Konsola yazdırma
console.log("Merhaba Dünya!");
// Uyarı penceresi
alert("FediaTech'e Hoşgeldiniz!");
// Sayfa içeriğini değiştirme
document.body.innerHTML = "JavaScript ile değiştirdim!
";
// Değişkenler
let isim = "Ali";
const yil = 2026;
console.log(`Merhaba ${isim}, yıl ${yil}`);
Değişkenler ve Veri Tipleri
JavaScript'te değişken tanımlamak için let, const ve var
kullanılır.
Modern JavaScript'te var kullanımı önerilmez.
| Anahtar Kelime | Açıklama | Kapsam (Scope) |
|---|---|---|
let |
Değiştirilebilir değişken | Blok scope |
const |
Sabit (Değiştirilemez) | Blok scope |
var |
Eski yöntem (Kullanmayın) | Function scope |
// String
let ad = "Ahmet";
let soyad = 'Yılmaz';
// Number
let yas = 25;
let boy = 1.75;
// Boolean
let ogrenciMi = true;
// Null ve Undefined
let bos = null; // Bilerek boş bırakılmış
let tanimsiz; // Değer atanmamış (undefined)
// Array (Dizi)
let renkler = ["Kırmızı", "Yeşil", "Mavi"];
// Object (Nesne)
let kisi = {
ad: "Ayşe",
yas: 30,
aktif: true
};
// typeof ile tip kontrolü
console.log(typeof ad); // "string"
console.log(typeof yas); // "number"
console.log(typeof kisi); // "object"
Operatörler
Matematiksel ve mantıksal işlemler için kullanılır.
// Aritmetik
let a = 10;
let b = 3;
console.log(a + b); // 13
console.log(a - b); // 7
console.log(a * b); // 30
console.log(a / b); // 3.333...
console.log(a % b); // 1 (Mod alma - Kalan)
console.log(a ** b); // 1000 (Üs alma)
// Atama
let x = 5;
x += 2; // x = x + 2 (7)
x *= 2; // x = x * 2 (14)
// Karşılaştırma
console.log(5 == "5"); // true (Sadece değer)
console.log(5 === "5"); // false (Değer VE Tip) - Önerilen!
console.log(5 != 4); // true
console.log(10 > 5); // true
// Mantıksal
let ehliyet = true;
let yas = 17;
if (yas >= 18 && ehliyet) {
console.log("Araba sürebilir");
}
if (yas < 18 || !ehliyet) {
console.log("Süremez");
}
Koşul İfadeleri (If-Else)
let saat = 14;
if (saat < 12) {
console.log("Günaydın");
} else if (saat < 18) {
console.log("İyi günler");
} else {
console.log("İyi akşamlar");
}
// Ternary Operatörü (Kısa if-else)
let mesaj = (saat < 12) 🔹 "Erken" : "Geç";
// Switch Case
let gun = 3;
switch (gun) {
case 1:
console.log("Pazartesi");
break;
case 2:
console.log("Salı");
break;
default:
console.log("Diğer gün");
}
Döngüler (Loops)
// For Döngüsü
for (let i = 0; i < 5; i++) {
console.log("Sayı:", i);
}
// While Döngüsü
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
// Dizilerde Döngü (forEach - Modern)
const meyveler = ["Elma", "Armut", "Muz"];
meyveler.forEach(function(meyve) {
console.log(meyve);
});
// Arrow Function ile (Daha kısa)
meyveler.forEach(meyve => console.log(meyve));
// for...of Döngüsü
for (let meyve of meyveler) {
console.log(meyve);
}
Fonksiyonlar
Kod tekrarını önlemek için fonksiyonlar kullanılır.
// 1. Fonksiyon Bildirimi (Function Declaration)
function topla(a, b) {
return a + b;
}
// 2. Fonksiyon İfadesi (Function Expression)
const carp = function(a, b) {
return a * b;
};
// 3. Ok Fonksiyonları (Arrow Functions - ES6)
const bol = (a, b) => {
return a / b;
};
// Tek satırsa süslü parantez ve return gerekmez
const cikar = (a, b) => a - b;
console.log(topla(2, 3)); // 5
console.log(cikar(10, 4)); // 6
DOM Manipülasyonu
Document Object Model (DOM), HTML sayfasını JavaScript ile yönetmenizi sağlar.
Element Seçme
// ID ile seçme
const baslik = document.getElementById("baslik");
// Class ile seçme
const kartlar = document.getElementsByClassName("kart");
// Etiket ile seçme
const paragraflar = document.getElementsByTagName("p");
// Query Selector (En güçlüsü!)
const ilkKart = document.querySelector(".kart"); // İlk eşleşen
const tumKartlar = document.querySelectorAll(".kart"); // Tümü
const ozelButon = document.querySelector("#myForm button.submit");
İçerik ve Stil Değiştirme
const element = document.querySelector("#kutu");
// İçerik değiştirme
element.innerHTML = "Kalın yazı";
element.textContent = "Sadece düz metin";
// Attribute (Nitelik) işlemleri
element.setAttribute("id", "yeniId");
element.getAttribute("class");
element.removeAttribute("disabled");
element.hasAttribute("hidden"); // true/false
// Class işlemleri
element.classList.add("aktif");
element.classList.remove("gizli");
element.classList.toggle("acik"); // Var ise kaldır, yoksa ekle
element.classList.contains("aktif"); // true/false
// Style değiştirme
element.style.color = "red";
element.style.backgroundColor = "#f0f0f0";
element.style.fontSize = "20px";
element.style.display = "none"; // Gizle
element.style.display = "block"; // Göster
Element Oluşturma ve Ekleme
// Yeni element oluşturma
const yeniDiv = document.createElement("div");
yeniDiv.textContent = "Yeni eklenen içerik";
yeniDiv.classList.add("kart", "yeni");
yeniDiv.id = "yeniKart";
// Sayfaya ekleme
const container = document.querySelector(".container");
container.appendChild(yeniDiv); // Sona ekle
container.prepend(yeniDiv); // Başa ekle
container.insertBefore(yeniDiv, referansElement);
// insertAdjacentHTML ile kolay ekleme
container.insertAdjacentHTML("beforeend", `
Dinamik Kart
JavaScript ile eklendi!
`);
// Element silme
const silinecek = document.querySelector(".silinecek");
silinecek.remove();
// veya parent üzerinden
container.removeChild(silinecek);
🔹 DOM Demo
Olaylar (Events)
Events, kullanıcı etkileşimlerini (tıklama, yazma, fare hareketi vb.) dinlemenizi ve yanıt vermenizi sağlar.
Event Listener Ekleme
const buton = document.querySelector("#myButton");
// addEventListener ile (Önerilen yöntem)
buton.addEventListener("click", function(event) {
console.log("Butona tıklandı!");
console.log("Tıklanan element:", event.target);
});
// Arrow function ile
buton.addEventListener("click", (e) => {
e.preventDefault(); // Varsayılan davranışı engelle
console.log("Arrow function çalıştı");
});
// Event listener kaldırma
function tiklama() {
console.log("Tıklandı!");
}
buton.addEventListener("click", tiklama);
buton.removeEventListener("click", tiklama);
Yaygın Event Türleri
| Event | Açıklama | Kullanım |
|---|---|---|
click |
Tıklama | Buton, link tıklamaları |
dblclick |
Çift tıklama | Özel işlemler |
mouseover |
Fare üzerine geldiğinde | Hover efektleri |
mouseout |
Fare ayrıldığında | Hover sonlandırma |
keydown |
Tuş basıldığında | Klavye kısayolları |
keyup |
Tuş bırakıldığında | Form girişi kontrolü |
submit |
Form gönderildiğinde | Form doğrulama |
change |
Değer değiştiğinde | Select, checkbox |
input |
Her karakterde | Anlık arama |
scroll |
Sayfa kaydırıldığında | Infinite scroll, lazy load |
Form Events
const form = document.querySelector("#myForm");
const input = document.querySelector("#emailInput");
// Form gönderme
form.addEventListener("submit", (e) => {
e.preventDefault(); // Sayfa yenilenmesini engelle
const formData = new FormData(form);
console.log("Email:", formData.get("email"));
// Doğrulama
if (!input.value.includes("@")) {
alert("Geçerli bir email girin!");
return;
}
console.log("Form gönderildi!");
});
// Anlık input takibi
input.addEventListener("input", (e) => {
console.log("Yazılan:", e.target.value);
});
// Focus ve Blur
input.addEventListener("focus", () => {
input.style.borderColor = "blue";
});
input.addEventListener("blur", () => {
input.style.borderColor = "";
});
Diziler (Arrays)
JavaScript dizileri, birden fazla değeri tek bir değişkende saklamanızı sağlar. Modern JavaScript güçlü dizi metodları sunar.
Dizi Oluşturma ve Temel İşlemler
// Dizi oluşturma
const meyveler = ["Elma", "Armut", "Muz"];
const sayilar = [1, 2, 3, 4, 5];
const karisik = [1, "metin", true, null, {ad: "Ali"}];
// Elemanlara erişim
console.log(meyveler[0]); // "Elma"
console.log(meyveler[meyveler.length - 1]); // Son eleman
// Eleman ekleme/çıkarma
meyveler.push("Çilek"); // Sona ekle
meyveler.unshift("Karpuz"); // Başa ekle
meyveler.pop(); // Sondan çıkar
meyveler.shift(); // Baştan çıkar
// Eleman arama
const index = meyveler.indexOf("Armut"); // 1
const varMi = meyveler.includes("Muz"); // true
// Dizi birleştirme
const yeniDizi = [...meyveler, ...sayilar]; // Spread operator
const birlesik = meyveler.concat(sayilar);
Güçlü Dizi Metodları (ES6+)
const ogrenciler = [
{ ad: "Ali", not: 85 },
{ ad: "Ayşe", not: 92 },
{ ad: "Mehmet", not: 78 },
{ ad: "Zeynep", not: 95 }
];
// forEach - Her eleman için işlem yap
ogrenciler.forEach((ogr, index) => {
console.log(`${index + 1}. ${ogr.ad}: ${ogr.not}`);
});
// map - Yeni dizi oluştur (dönüştürme)
const isimler = ogrenciler.map(ogr => ogr.ad);
// ["Ali", "Ayşe", "Mehmet", "Zeynep"]
const notlar = ogrenciler.map(ogr => ogr.not * 1.1);
// Tüm notlara %10 eklendi
// filter - Koşula uyan elemanlar
const basarililar = ogrenciler.filter(ogr => ogr.not >= 80);
// [{ ad: "Ali", not: 85 }, { ad: "Ayşe", not: 92 }, { ad: "Zeynep", not: 95 }]
// find - İlk eşleşeni bul
const zeynep = ogrenciler.find(ogr => ogr.ad === "Zeynep");
// findIndex - İlk eşleşenin indeksi
const mehmetIndex = ogrenciler.findIndex(ogr => ogr.ad === "Mehmet");
// reduce - Tek değere indirge
const toplamNot = ogrenciler.reduce((acc, ogr) => acc + ogr.not, 0);
const ortalama = toplamNot / ogrenciler.length;
// sort - Sırala
const sirali = [...ogrenciler].sort((a, b) => b.not - a.not);
// Büyükten küçüğe sıralandı
// some ve every
const hepsiGectiMi = ogrenciler.every(ogr => ogr.not >= 50); // true
const birisi90Ustu = ogrenciler.some(ogr => ogr.not > 90); // true
// Zincirleme kullanım
const sonuc = ogrenciler
.filter(ogr => ogr.not >= 80)
.map(ogr => ogr.ad)
.sort();
// ["Ali", "Ayşe", "Zeynep"]
map, filter, reduce
metodlarını
öğrenmek JavaScript'te ileri seviye kod yazmanın anahtarıdır!
Objeler (Objects)
Objeler, ilişkili verileri anahtar-değer çiftleri olarak saklamanızı sağlar. JavaScript'te objeler son derece esnek ve güçlüdür.
Obje Oluşturma ve Erişim
// Obje oluşturma
const ogrenci = {
ad: "Ali",
soyad: "Yılmaz",
yas: 17,
notlar: [85, 90, 78],
adres: {
sehir: "Kayseri",
ilce: "Melikgazi"
},
// Metod
tamAd() {
return `${this.ad} ${this.soyad}`;
},
ortalama() {
const toplam = this.notlar.reduce((a, b) => a + b, 0);
return toplam / this.notlar.length;
}
};
// Erişim yöntemleri
console.log(ogrenci.ad); // "Ali"
console.log(ogrenci["soyad"]); // "Yılmaz"
console.log(ogrenci.adres.sehir); // "Kayseri"
console.log(ogrenci.tamAd()); // "Ali Yılmaz"
console.log(ogrenci.ortalama()); // 84.33
// Değer ekleme/değiştirme
ogrenci.email = "ali@fediatech.com";
ogrenci.yas = 18;
// Değer silme
delete ogrenci.email;
// Anahtar kontrolü
console.log("ad" in ogrenci); // true
console.log(ogrenci.hasOwnProperty("soyad")); // true
Object Destructuring (ES6+)
const kullanici = {
ad: "Ayşe",
email: "ayse@fediatech.com",
yas: 25,
rol: "developer"
};
// Klasik yöntem
const ad = kullanici.ad;
const email = kullanici.email;
// Destructuring (Modern yöntem)
const { ad, email, yas } = kullanici;
console.log(ad, email, yas);
// Yeniden adlandırma
const { ad: isim, email: mail } = kullanici;
console.log(isim, mail);
// Varsayılan değer
const { ad, sehir = "Bilinmiyor" } = kullanici;
// İç içe destructuring
const { adres: { sehir, ilce } } = ogrenci;
// Fonksiyon parametresinde destructuring
function kullaniciBilgisi({ ad, email, rol = "user" }) {
console.log(`${ad} (${email}) - ${rol}`);
}
kullaniciBilgisi(kullanici);
Spread ve Rest Operatörleri
// Spread - Objeyi kopyala/birleştir
const orijinal = { a: 1, b: 2 };
const kopya = { ...orijinal };
const genisletilmis = { ...orijinal, c: 3, d: 4 };
// Objeleri birleştirme
const varsayilan = { tema: "dark", dil: "tr" };
const kullanici = { dil: "en", isim: "Ali" };
const ayarlar = { ...varsayilan, ...kullanici };
// { tema: "dark", dil: "en", isim: "Ali" }
// Rest - Geri kalanları topla
const { ad, ...diger } = kullanici;
// ad = "Ali"
// diger = { email: "...", yas: 25, rol: "..." }
Asenkron JavaScript
JavaScript tek iş parçacıklı (single-threaded) çalışır, ancak asenkron programlama sayesinde uzun süren işlemler (API çağrıları, dosya okuma) ana iş parçacığını bloklamadan yapılabilir.
Callback, Promise ve Async/Await
// 🔹 Callback Hell (Eski yöntem - Kaçının!)
veriGetir(url, function(veri) {
isleVeri(veri, function(sonuc) {
kaydet(sonuc, function(id) {
console.log("Kaydedildi:", id);
});
});
});
// 🔹 Promise zinciri
veriGetir(url)
.then(veri => isleVeri(veri))
.then(sonuc => kaydet(sonuc))
.then(id => console.log("Kaydedildi:", id))
.catch(hata => console.error("Hata:", hata));
// 🔹 Async/Await (En modern ve okunabilir)
async function veriIsle() {
try {
const veri = await veriGetir(url);
const sonuc = await isleVeri(veri);
const id = await kaydet(sonuc);
console.log("Kaydedildi:", id);
} catch (hata) {
console.error("Hata:", hata);
}
}
Promise Oluşturma
// Promise oluşturma
function bekle(ms) {
return new Promise((resolve, reject) => {
if (ms < 0) {
reject(new Error("Süre negatif olamaz!"));
}
setTimeout(() => {
resolve(`${ms}ms beklendi`);
}, ms);
});
}
// Kullanım
bekle(2000)
.then(mesaj => console.log(mesaj))
.catch(hata => console.error(hata));
// Async/Await ile
async function main() {
const mesaj = await bekle(2000);
console.log(mesaj);
}
// Promise.all - Paralel çalıştırma
async function tumVerilerGetir() {
const [kullanicilar, urunler, siparisler] = await Promise.all([
fetch("/api/kullanicilar").then(r => r.json()),
fetch("/api/urunler").then(r => r.json()),
fetch("/api/siparisler").then(r => r.json())
]);
console.log(kullanicilar, urunler, siparisler);
}
// Promise.race - İlk tamamlanan
const enHizli = await Promise.race([
fetch(server1),
fetch(server2),
fetch(server3)
]);
API Kullanımı (Fetch)
Fetch API, sunucudan veri almak veya sunucuya veri göndermek için kullanılan modern JavaScript metodudur. AJAX işlemlerinin modern karşılığıdır.
GET İsteği
// Basit GET isteği
async function kullanicilariGetir() {
try {
const response = await fetch("https://jsonplaceholder.typicode.com/users");
if (!response.ok) {
throw new Error(`HTTP Hatası: ${response.status}`);
}
const kullanicilar = await response.json();
console.log(kullanicilar);
// Verileri göster
kullanicilar.forEach(k => {
console.log(`${k.name} - ${k.email}`);
});
} catch (hata) {
console.error("Veri alınamadı:", hata);
}
}
kullanicilariGetir();
// Tek kullanıcı getir
async function kullaniciGetir(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
return await response.json();
}
const ali = await kullaniciGetir(1);
console.log(ali.name);
POST, PUT, DELETE İstekleri
// POST - Yeni kayıt oluştur
async function yeniKullaniciEkle(kullanici) {
const response = await fetch("https://jsonplaceholder.typicode.com/users", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(kullanici)
});
return await response.json();
}
const yeniKullanici = await yeniKullaniciEkle({
name: "Ali Yılmaz",
email: "ali@fediatech.com",
username: "aliyilmaz"
});
console.log("Eklendi:", yeniKullanici);
// PUT - Güncelle
async function kullaniciGuncelle(id, veri) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(veri)
});
return await response.json();
}
// DELETE - Sil
async function kullaniciSil(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`, {
method: "DELETE"
});
return response.ok;
}
const silindi = await kullaniciSil(1);
console.log(silindi 🔹 "Silindi" : "Silinemedi");