
Türkçe pratik rehber: modern JavaScript özelliklerini gerçek örnekler ve kıdemli geliştirici bakış açısıyla öğrenin.
JavaScript sözdizimini bilmek, ekip tarafından güvenle sürdürülebilen JavaScript yazmakla aynı şey değildir. Profesyonel kod daha okunaklıdır; hata, iptal, veri şekli ve performans konularında ne yaptığını açıkça gösterir.
Bu rehber, deneyimli geliştiricilerin gerçek uygulamalarda kullandığı 15 modern özelliği pratik örneklerle açıklar. Amaç her yerde kısa ve akıllı sözdizimi kullanmak değil, belirsizliği azaltmaktır.
?., değer null veya undefined olduğunda güvenli erişim sağlar. ?? yalnızca bu iki eksik değer için varsayılan değer verir.
function getCustomerLabel(order) {
const name = order.customer?.profile?.displayName ?? 'Guest';
const points = order.customer?.loyaltyPoints ?? 0;
return `${name} (${points} points)`;
}
0, false veya boş metin geçerli değerlerse || yerine ?? kullanın. Uygulamanızın garanti ettiği bir değeri ?. ile sessizce gizlemeyin.
Destructuring, fonksiyonun beklediği veri şeklini imzada gösterir.
function createAccount({ email, role = 'member', notifications = true }) {
if (!email) throw new Error('email is required');
return { email, role, notifications };
}
API alanlarını created_at: createdAt biçiminde yeniden adlandırabilirsiniz. Sadece gereken alanları alın; çok fazla parametre sorumluluğun bölünmesi gerektiğini gösterebilir.
async ve await akışı okunaklı yapar, ancak iyi kod hatanın nerede ele alınacağını da belirler.
async function loadDashboard(userId) {
const response = await fetch(`/api/users/${userId}/dashboard`);
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
return response.json();
}
Bir hatayı yakalayıp sebepsiz yere undefined döndürmek, açık bir sorunu daha sonra oluşan belirsiz bir probleme çevirir.
Bağımsız istekleri paralel çalıştırın; birbirine bağlı işlemleri sıralı await ile yapın.
const [profile, projects, alerts] = await Promise.all([
fetchProfile(userId), fetchProjects(userId), fetchAlerts(userId),
]);
Her sonuca ihtiyaç duyuyorsanız Promise.allSettled() kullanın. Binlerce promise oluşturmak yerine kuyruk veya concurrency limiter kullanın.
Yeni arama başladığında eski isteği iptal etmek kaynakları korur.
const controller = new AbortController();
const response = await fetch('/api/products?q=rust', {
signal: controller.signal,
});
controller.abort();
Beklenen iptali gerçek hatadan ayırın; izleme sisteminizi gereksiz hatalarla doldurmayın.
const nextUser = {
...user,
preferences: { ...user.preferences, theme: 'dark' },
};
Spread yalnızca sığ kopya üretir. Derin ve yapılandırılabilir veri için structuredClone() kullanılabilir; fonksiyonları ve DOM düğümlerini kopyalamaz.
Benzersiz değerler için Set, dinamik anahtarlar için Map kullanın.
const uniqueTags = [...new Set(['js', 'api', 'js'])];
const counts = new Map();
counts.set('javascript', (counts.get('javascript') ?? 0) + 1);
Bu yaklaşım sıradan nesnelerdeki kalıtsal özellik çakışmalarını da önler.
map() dönüştürür, filter() seçer, find() ilk eşleşmeyi bulur, some() herhangi bir eşleşmeyi, every() tüm eşleşmeleri kontrol eder.
const activeEmails = users
.filter((user) => user.isActive)
.map((user) => user.email);
Her problemi reduce() ile çözmeyin. Çok adımlı veya erken çıkışlı işlemlerde for...of daha anlaşılır olabilir.
Destekleyen çalışma zamanlarında Object.groupBy() uzun reducer kodlarını sadeleştirir.
const ticketsByStatus = Object.groupBy(tickets, (ticket) => ticket.status);
Yeni bir özelliği kullanmadan önce tarayıcı ve Node.js sürümlerini kontrol edin.
# ile başlayan alanlar adlandırma kuralıyla değil, dil tarafından korunur.
class RateLimiter {
#requests = 0;
constructor(limit) { this.limit = limit; }
tryConsume() {
if (this.#requests >= this.limit) return false;
this.#requests += 1; return true;
}
}
Gizlilik değişmezleri korur; yine de sınıfları tek bir sorumlulukta tutun.
import ve export bağımlılıkları açıklar. import() kodu yalnızca gerektiğinde yükler.
async function openChart(data) {
const { renderChart } = await import('./chart.js');
return renderChart(data);
}
Grafikler, editörler ve yönetim ekranları için başlangıç paketini küçültebilir.
Tarih, sayı, para birimi ve liste biçimlendirmesinde Intl kullanın.
const price = new Intl.NumberFormat('tr-TR', {
style: 'currency', currency: 'TRY',
}).format(1299.5);
Elle virgül, tarih ve para sembolü birleştirmek yerine platformun yerelleştirmesinden yararlanın.
URL’yi string birleştirerek oluşturmak boşluklarda, & işaretlerinde ve Unicode karakterlerinde sorun çıkarabilir.
const url = new URL('/api/articles', window.location.origin);
url.searchParams.set('language', 'tr');
url.searchParams.set('query', 'async JavaScript');
fetch(url);
Özel hata sınıfları doğrulama, yetki, ağ ve alan hatalarını ayırmayı sağlar.
class ValidationError extends Error {
constructor(message, details = {}) {
super(message); this.name = 'ValidationError'; this.details = details;
}
}
Şifreleri, token’ları veya kişisel verileri hata mesajlarına ve loglara koymayın.
Closure, değerleri globale açmadan çevresindeki duruma erişen bir fonksiyon oluşturur.
function createIdGenerator(prefix = 'item') {
let current = 0;
return () => `${prefix}-${++current}`;
}
Factory, memoization ve callback’lerde yararlıdır; uzun ömürlü dinleyicilerde gereksiz büyük nesneleri yakalamayın.
async function findUsers({ query, page = 1, signal } = {}) {
const normalizedQuery = query?.trim();
if (!normalizedQuery) throw new ValidationError('Arama gerekli');
const url = new URL('/api/users', window.location.origin);
url.searchParams.set('q', normalizedQuery);
url.searchParams.set('page', String(page));
const response = await fetch(url, { signal });
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const payload = await response.json();
return { users: payload.data ?? [], total: payload.meta?.total ?? 0 };
}
Profesyonel kısım özelliklerin sayısı değil; erken doğrulama, güvenli URL, iptal, HTTP kontrolü ve öngörülebilir sonuçtur.
?. ile geçersiz durumu gizlemek.Promise.all() içine koymak.Kıdemli JavaScript, kaç özellik bildiğinizi göstermek değil; davranışı açık, veriyi doğru, hatayı bilinçli ve çalışma zamanını dikkate alan kod yazmaktır. Mevcut kodunuzda en çok belirsizliği azaltan özelliklerle başlayın.
Henüz onaylı yorum yok. Yeni yanıtlar moderasyon bekleyebilir.