Event Listener Ekleme:
const button = document.querySelector('button');
button.addEventListener('click', function() {
console.log('Tıklandı!');
});
button.addEventListener('click', () => {
console.log('Tıklandı!');
});
const handleClick = () => console.log('Clicked');
button.addEventListener('click', handleClick);
button.removeEventListener('click', handleClick);
Yaygın Event Tipleri:
element.addEventListener('click', handler);
element.addEventListener('dblclick', handler);
element.addEventListener('mouseenter', handler);
element.addEventListener('mouseleave', handler);
element.addEventListener('mousemove', handler);
element.addEventListener('keydown', handler);
element.addEventListener('keyup', handler);
element.addEventListener('keypress', handler);
form.addEventListener('submit', handler);
input.addEventListener('input', handler);
input.addEventListener('change', handler);
input.addEventListener('focus', handler);
input.addEventListener('blur', handler);
window.addEventListener('load', handler);
window.addEventListener('resize', handler);
window.addEventListener('scroll', handler);
Event Object:
button.addEventListener('click', (event) => {
console.log(event.type);
console.log(event.target);
console.log(event.currentTarget);
console.log(event.clientX, event.clientY);
event.preventDefault();
event.stopPropagation();
});
Event Delegation:
const ul = document.querySelector('ul');
ul.addEventListener('click', (e) => {
if (e.target.matches('li')) {
console.log('Li tıklandı:', e.target.textContent);
}
})
break Kullanmayı Unutmayın!
switch-case'de break kullanmazsanız, sonraki case'ler de çalışır (fall-through). Bu genellikle istenmeyen bir durumdur.
Döngüler (Loops)
for Döngüsü:
for (let i = 0; i < 5; i++) {
console.log(i);
}
while Döngüsü:
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
do-while Döngüsü:
let i = 0;
do {
console.log(i);
i++;
} while (i < 5);
for...of Döngüsü (Dizi/İterable için):
const renkler = ['kırmızı', 'yeşil', 'mavi'];
for (const renk of renkler) {
console.log(renk);
}
for...in Döngüsü (Obje özellikleri için):
const kisi = {
isim: 'Ali',
yas: 25,
sehir: 'İstanbul'
};
for (const anahtar in kisi) {
console.log(`${anahtar}: ${kisi[anahtar]}`);
}
break ve continue:
for (let i = 0; i < 10; i++) {
if (i === 5) break;
console.log(i);
}
for (let i = 0; i < 5; i++) {
if (i === 2) continue;
console.log(i);
}
Modern Alternatifler:
• Diziler için: forEach(), map(), filter(), reduce()
• for...of diziler için, for...in objeler için kullanın
• Performans kritikse klasik for döngüsü en hızlısıdır
Fonksiyonlar (Functions)
Function Declaration:
function selamla(isim) {
return `Merhaba, ${isim}!`;
}
console.log(selamla('Ali'));
Function Expression:
const topla = function(a, b) {
return a + b;
};
console.log(topla(5, 3));
Arrow Function (ES6):
const kare = x => x * x;
const topla = (a, b) => a + b;
const islemYap = (a, b) => {
const sonuc = a + b;
return sonuc * 2;
};
Varsayılan Parametreler (Default Parameters):
function selamla(isim = 'Misafir') {
return `Merhaba, ${isim}!`;
}
console.log(selamla());
console.log(selamla('Ali'));
Rest Parameters (...):
function topla(...sayilar) {
return sayilar.reduce((toplam, sayi) => toplam + sayi, 0);
}
console.log(topla(1, 2, 3, 4, 5));
Callback Functions:
function islemYap(a, b, callback) {
const sonuc = callback(a, b);
return sonuc;
}
const sonuc1 = islemYap(5, 3, (a, b) => a + b);
const sonuc2 = islemYap(5, 3, (a, b) => a * b);
console.log(sonuc1);
console.log(sonuc2);
IIFE (Immediately Invoked Function Expression):
(function() {
console.log('Bu fonksiyon hemen çalışır!');
})();
(() => {
console.log('Modern IIFE');
})();
Farklar:
• Arrow function'lar kendi this'e sahip değildir
• Arrow function'lar constructor olamaz
• Arrow function'larda arguments objesi yok
• Arrow function söz dizimi daha kısa
Ne zaman kullanmalı?
Callback'lerde ve kısa fonksiyonlarda arrow function tercih edin.
Diziler (Arrays)
Dizi Oluşturma:
const sayilar = [1, 2, 3, 4, 5];
const karisik = [1, 'iki', true, null, {isim: 'Ali'}];
const dizi = new Array(5);
Dizi Erişim ve Değiştirme:
const meyveler = ['elma', 'armut', 'muz'];
console.log(meyveler[0]);
meyveler[1] = 'çilek';
console.log(meyveler.length);
Temel Dizi Metotları:
const arr = [1, 2, 3];
arr.push(4);
arr.pop();
arr.unshift(0);
arr.shift();
const arr2 = [4, 5];
const birlesmis = arr.concat(arr2);
const parcali = arr.slice(1, 3);
arr.splice(1, 2, 'a', 'b');
Dizi İterasyon Metotları:
const sayilar = [1, 2, 3, 4, 5];
sayilar.forEach(sayi => console.log(sayi));
const kareler = sayilar.map(sayi => sayi * sayi);
const ciftler = sayilar.filter(sayi => sayi % 2 === 0);
const toplam = sayilar.reduce((acc, sayi) => acc + sayi, 0);
const bulunan = sayilar.find(sayi => sayi > 3);
const varMi = sayilar.some(sayi => sayi > 4);
const tumü = sayilar.every(sayi => sayi > 0);
Dizi Sıralama ve Arama:
const sayilar = [3, 1, 4, 1, 5];
sayilar.sort();
sayilar.reverse();
sayilar.sort((a, b) => a - b);
sayilar.indexOf(4);
sayilar.includes(3);
Spread Operator (...):
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const birlesmis = [...arr1, ...arr2];
const kopya = [...arr1];
Destructuring:
const renkler = ['kırmızı', 'yeşil', 'mavi'];
const [ilk, ikinci, ucuncu] = renkler;
console.log(ilk);
const [, , son] = renkler;
console.log(son);
const [bas, ...geri] = renkler;
console.log(geri);
Performans İpuçları:
• push/pop baştan ekleme/çıkarmadan (shift/unshift) daha hızlıdır
• Büyük dizilerde splice yerine filter kullanın
• map, filter, reduce immutable işlemlerdir (orijinal diziyi değiştirmez)
• Zincirleme metot kullanırken dikkatli olun (performans)
Objeler (Objects)
Obje Oluşturma:
const kisi = {
isim: 'Ali',
yas: 25,
sehir:
var eski = 'eski yöntem';
let isim = 'Ali';
isim = 'Veli';
const PI = 3.14159;
Değişken Adlandırma Kuralları:
- • Harf, rakam, _ veya $ içerebilir
- • Rakam ile başlayamaz
- • Büyük/küçük harf duyarlıdır (myVar ≠ myvar)
- • Rezerve kelimeler kullanılamaz (let, const, if, for, vb.)
- • camelCase kullanın: myVariableName
var vs let vs const:
var: Function-scoped, hoisting var, yeniden tanımlanabilir (kullanmayın!)
let: Block-scoped, yeniden atanabilir, modern tercih
const: Block-scoped, yeniden atanamaz, obje/array içeriği değişebilir
Öneri: Varsayılan olarak const kullanın, gerekirse let, var kullanmayın!
Scope (Kapsam):
let global = 'heryerde';
function ornek() {
let fonksiyon = 'sadece burada';
if (true) {
let blok = 'sadece if içinde';
console.log(global);
}
}
Modern JavaScript Best Practice:
• Değişkenleri kullanacağınız yere en yakın tanımlayın
• const kullanın, mutasyona ihtiyaç varsa let kullanın
• Global değişkenlerden kaçının
• Anlamlı isimler verin: x yerine userAge
Veri Tipleri (Data Types)
Primitive (İlkel) Tipler:
let isim = "Ali";
let soyad = 'Yılmaz';
let mesaj = `Merhaba ${isim}!`;
let tam = 42;
let ondalik = 3.14;
let buyuk = 1e6;
let aktif = true;
let pasif = false;
let tanimsiz;
console.log(tanimsiz);
let bos = null;
let sembol = Symbol('açıklama');
let cokBuyuk = 9007199254740991n;
Reference (Referans) Tipler:
let kisi = {
isim: 'Ali',
yas: 25
};
let renkler = ['kırmızı', 'yeşil', 'mavi'];
let selamla = function() {
return 'Merhaba!';
};
Tip Kontrolü:
typeof "merhaba";
typeof 42;
typeof true;
typeof undefined;
typeof null;
typeof {};
typeof [];
Array.isArray([]);
Tip Dönüşümleri:
String(123);
(123).toString();
Number("123");
parseInt("123px");
parseFloat("3.14");
+"123";
Boolean(1);
Boolean(0);
!!"text";
Falsy Değerler: JavaScript'te false olarak değerlendirilen değerler:
false, 0, -0, 0n, "", null, undefined, NaN
Bunun dışındaki her şey truthy'dir (true olarak değerlendirilir).
Operatörler (Operators)
Aritmetik Operatörler:
let a = 10, b = 3;
a + b;
a - b;
a * b;
a / b;
a % b;
a ** b;
let x = 5;
x++;
++x;
x--;
--x;
Atama Operatörleri:
let x = 10;
x += 5;
x -= 3;
x *= 2;
x /= 4;
x %= 5;
x **= 3;
Karşılaştırma Operatörleri:
5 == "5";
5 === "5";
5 != "5";
5 !== "5";
5 > 3;
5 < 3;
5 >= 5;
5 <= 4;
Önemli: Her zaman === ve !== kullanın!
== ve != tip dönüşümü yaptığı için beklenmedik sonuçlar verebilir.
Örnek: 0 == false → true, "" == false → true
Mantıksal Operatörler:
true && true;
true && false;
true || false;
false || false;
!true;
!false;
Ternary (Üçlü) Operatör:
let yas = 20;
let durum = yas >= 18 ? 'Yetişkin' : 'Çocuk';
console.log(durum);
Nullish Coalescing (??) - ES2020:
let a = null;
let b = a ?? 'varsayılan';
let c = 0;
let d = c ?? 'varsayılan';
let e = 0 || 'varsayılan';
Modern JavaScript Operatörleri:
• Optional Chaining: user?.address?.city
• Nullish Coalescing: value ?? defaultValue
• Logical Assignment: x ??= 10, x ||= 5, x &&= 3
Koşul İfadeleri (Conditionals)
if-else İfadesi:
let yas = 20;
if (yas >= 18) {
console.log('Yetişkin');
} else {
console.log('Çocuk');
}
else if Zinciri:
let not = 85;
if (not >= 90) {
console.log('A');
} else if (not >= 80) {
console.log('B');
} else if (not >= 70) {
console.log('C');
} else {
console.log('F');
}
switch-case İfadesi:
let gun = 'Pazartesi';
switch (gun) {
case 'Pazartesi':
console.log('Haftanın ilk günü');
break;
case 'Cuma':
console.log('Haftanın son iş günü');
break;
case 'Cumartesi':
case 'Pazar':
console.log('Hafta sonu!');
break;
default:
console.log('Hafta içi');
}
break Kullanmayı Unutmayın!
switch-case'de break kullanmazsanız, sonraki case'ler de çalışır (fall-through). Bu genellikle istenmeyen bir durumdur.
ul.addEventListener('click', (e) => {
if (e.target.matches('li')) {
console.log('Li tıklandı:', e.target.textContent);
}
});
Event Delegation Avantajları:
• Dinamik eklenen elementler için de çalışır
• Performans - tek listener yerine çoklu listener'dan daha hızlı
• Memory - daha az event listener = daha az bellek kullanımı
Asenkron JavaScript
Callback Functions:
setTimeout(() => {
console.log('2 saniye sonra');
}, 2000);
const intervalId = setInterval(() => {
console.log('Her 1 saniyede');
}, 1000);
clearInterval(intervalId);
Promises:
const myPromise = new Promise((resolve, reject) => {
const success = true;
if (success) {
resolve('Başarılı!');
} else {
reject('Hata oluştu!');
}
});
myPromise
.then(result => console.log(result))
.catch(error => console.error(error))
.finally(() => console.log('Bitti'));
Promise Chaining:
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log(data);
return data.userId;
})
.then(userId => fetch(`/users/${userId}`))
.then(response => response.json())
.then(user => console.log(user))
.catch(error => console.error(error));
async/await (ES2017):
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
return data;
} catch (error) {
console.error('Hata:', error);
}
}
fetchData();
const fetchData2 = async () => {
const data = await fetch('/api').then(r => r.json());
return data;
};
Promise Utility Methods:
const promise1 = fetch('/api1');
const promise2 = fetch('/api2');
const promise3 = fetch('/api3');
Promise.all([promise1, promise2, promise3])
.then(responses => console.log('Hepsi bitti'))
.catch(error => console.log('Biri hata verdi'));
Promise.race([promise1, promise2, promise3])
.then(result => console.log('İlk biten'));
Promise.allSettled([promise1, promise2, promise3])
.then(results => console.log(results));
Promise.any([promise1, promise2, promise3])
.then(result => console.log('İlk başarılı'));
async/await Avantajları:
• Daha okunabilir (senkron kod gibi)
• Daha kolay hata yönetimi (try/catch)
• Debug etmesi daha kolay
Ne zaman Promise.then():
• Paralel işlemler için (Promise.all ile birlikte)
• Conditional chaining gerektiğinde
ES6+ Modern Özellikler
Template Literals:
const isim = 'Ali';
const yas = 25;
const mesaj = `Benim adım ${isim} ve ${yas} yaşındayım`;
const html = `
<div>
<h1>${isim}</h1>
</div>
`;
Destructuring Assignment:
const [a, b, c] = [1, 2, 3];
const { isim, yas } = { isim: 'Ali', yas: 25 };
function printUser({ isim, yas }) {
console.log(`${isim}, ${yas}`);
}
Spread & Rest Operators:
const arr1 = [1, 2];
const arr2 = [3, 4];
const combined = [...arr1, ...arr2];
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const merged = { ...obj1, ...obj2 };
function topla(...sayilar) {
return sayilar.reduce((a, b) => a + b, 0);
}
topla(1, 2, 3, 4);
Enhanced Object Literals:
const isim = 'Ali';
const yas = 25;
const kisi = { isim, yas };
const obj = {
selamla() {
return 'Merhaba';
}
};
Classes (ES6):
class Person {
constructor(isim, yas) {
this.isim = isim;
this.yas = yas;
}
selamla() {
return `Merhaba, ben ${this.isim}`;
}
static info() {
return 'Person class';
}
}
class Student extends Person {
constructor(isim, yas, okul) {
super(isim, yas);
this.okul = okul;
}
oku() {
return `${this.okul}'da okuyorum`;
}
}
const ogrenci = new Student('Ali', 20, 'ITÜ');
Map ve Set:
const map = new Map();
map.set('isim', 'Ali');
map.set('yas', 25);
console.log(map.get('isim'));
map.has('yas');
map.delete('yas');
const set = new Set([1, 2, 3, 3, 4]);
console.log(set);
set.add(5);
set.has(3);
set.delete(2);
Modern JavaScript İpuçları:
• Template literals kullanın (string concatenation yerine)
• Destructuring ile kod daha temiz olur
• Spread operator immutable işlemler için idealdir
• Map/Set object'lerden daha performanslıdır (büyük data için)
Modüller (ES6 Modules)
Export (Dışa Aktarma):
export const PI = 3.14159;
export function topla(a, b) {
return a + b;
}
export class Calculator {
}
export default function carp(a, b) {
return a * b;
}
Import (İçe Aktarma):
import { PI, topla, Calculator } from './math.js';
import { topla as add } from './math.js';
import * as math from './math.js';
console.log(math.PI);
import carp from './math.js';
import carp, { PI, topla } from './math.js';
HTML'de Modül Kullanımı:
<script type="module" src="app.js"></script>
CORS Uyarısı: Modüller file:// protokolü ile çalışmaz. Local development için bir HTTP server kullanın (Live Server, http-server, vb.)
Fetch API
Temel GET İsteği:
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Hata:', error));
async/await ile:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log(data);
return data;
} catch (error) {
console.error('Hata:', error);
}
}
POST İsteği:
async function postData(url, data) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
return await response.json();
}
postData('/api/users', { isim: 'Ali', yas: 25 })
.then(data => console.log(data));
Diğer HTTP Metotları:
fetch('/api/users/1', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ isim: 'Veli' })
});
fetch('/api/users/1', {
method: 'DELETE'
});
Headers ve Authentication:
fetch('/api/protected', {
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
'Content-Type': 'application/json'
}
});
Local Storage & Session Storage
localStorage (Kalıcı Depolama):
localStorage.setItem('isim', 'Ali');
const isim = localStorage.getItem('isim');
console.log(isim);
localStorage.removeItem('isim');
localStorage.clear();
Obje Depolama (JSON):
const user = { isim: 'Ali', yas: 25 };
localStorage.setItem('user', JSON.stringify(user));
const storedUser = JSON.parse(localStorage.getItem('user'));
console.log(storedUser.isim);
sessionStorage (Oturum Depolama):
sessionStorage.setItem('token', 'abc123');
const token = sessionStorage.getItem('token');
sessionStorage.removeItem('token');
localStorage vs sessionStorage:
localStorage:
• Kalıcı - tarayıcı kapatılsa bile kalır
• Aynı origin'deki tüm tab'lar paylaşır
• Manuel silinene kadar kalır
sessionStorage:
• Geçici - tab/pencere kapanınca silinir
• Her tab'ın kendi storage'ı var
• Oturum bazlı veriler için ideal
Güvenlik Uyarısı:
• localStorage/sessionStorage şifrelenmez!
• Hassas bilgileri (şifre, kredi kartı) saklamayın
• XSS saldırılarına açıktır
• Token'lar için httpOnly cookie tercih edilir
• ~5-10MB limit vardır
En İyi Uygulamalar ve İpuçları
Kod Yazım Standartları:
• Anlamlı değişken/fonksiyon isimleri kullanın
• Fonksiyonları küçük ve tek amaçlı tutun
• DRY (Don't Repeat Yourself) - tekrar etmeyin
• Yorum yazmak yerine açıklayıcı kod yazın
• Consistent indentation ve formatting
• ESLint ve Prettier kullanın
Performans İpuçları:
for (let i = 0; i < 100; i++) {
document.getElementById('list').innerHTML += '<li>Item</li>';
}
let html = '';
for (let i = 0; i < 100; i++) {
html += '<li>Item</li>';
}
document.getElementById('list').innerHTML = html;
Hata Yönetimi:
try {
const data = JSON.parse(jsonString);
processData(data);
} catch (error) {
console.error('Hata oluştu:', error.message);
showErrorMessage('Veri işlenirken hata oluştu');
} finally {
hideLoadingSpinner();
}
Debugging İpuçları:
console.table(arrayOfObjects);
console.time('işlem');
console.timeEnd('işlem');
console.trace();
console.dir(object);
debugger;
Öğrenmeye Devam İçin:
• MDN Web Docs - en iyi JavaScript referansı
• JavaScript.info - detaylı tutorial
• FreeCodeCamp - interaktif öğrenme
• GitHub'da açık kaynak projelere katkı
• Günlük kod yazın - pratik yapın!
• LeetCode, HackerRank - problem çözün
Popüler JavaScript Framework'leri:
• React: Facebook - component-based UI
• Vue.js: Progressive framework
• Angular: Google - full-featured framework
• Node.js: Backend JavaScript
• Express.js: Node.js web framework
• Next.js: React framework (SSR)
• TypeScript: JavaScript with types
JavaScript Yolculuğuna Devam!
JavaScript web'in kalbi, modern uygulamaların dili. Öğrenmenin sonu yok - her gün yeni şeyler keşfedin ve projeler yapın!
Pratik yapın: Teoriden çok kod yazın
Projeler yapın: To-do list, calculator, weather app...
Kod okuyun: GitHub'da başkalarının kodunu inceleyin
Dev Tools kullanın: Browser console'u en iyi arkadaşınız
Community'ye katılın: Stack Overflow, Reddit, Discord
Güncel kalın: JavaScript hızla gelişiyor
console.log('Happy Coding! 🚀');
Web'in dilini öğrendiniz!