ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz

Sayfayı kopyala
ES5 (ECMAScript 5), Aralık 2009'da yayınlanan ve Haziran 2011'de v5.1 güncellemesini alan 5. ECMAScript standardıdır.
Modern JavaScript dünyasının temelleri bu sürümle atılmıştır. Kendisinden sonra gelen ES6 (ES2015) ile birlikte tarayıcı uyumluluğu ve modern dil özelliklerinin standartlaşmasını sağlamıştır.
💡 Özet (TL;DR):
- Strict Mode: JavaScript'in esnek ve hata yapmaya müsait yapısını disipline eden
'use strict'ifadesi eklendi.- Yeni Dizi Metotları: Döngü yazmayı azaltan
forEach,map,filter,reduceveeverygibi fonksiyonel dizi metotları geldi.- Nesne Yetenekleri: Nesnelerin özelliklerini koruma altına alan
Object.defineProperty(),Object.freeze()veObject.create()eklendi.- JSON Desteği: JSON verilerini ayrıştırmayı ve string'e dönüştürmeyi sağlayan yerleşik
JSON.parse()veJSON.stringify()geldi.
ES5 İle Gelen Temel Yenilikler
ES5, JavaScript'e hem fonksiyonel programlama yetenekleri kazandırmış hem de nesne yönelimli programlama (OOP) tarafını güçlendirmiştir. Öne çıkan özellikleri pratik örneklerle inceleyelim:
1. Strict Mode (Katı Mod)
Kodunuzun en başına ya da bir fonksiyonun ilk satırına "use strict"; ekleyerek bu modu aktif edebilirsiniz. Strict mode, hatalı ve güvensiz yazım şekillerini engelleyerek tarayıcının hata fırlatmasını sağlar.
"use strict";
// ❌ Hata fırlatır: Değişken tanımlanmadan kullanılamaz (Uncaught ReferenceError)
x = 3.14;
// ❌ Hata fırlatır: Bir nesne özelliğini silmeye çalışmak
delete Object.prototype;
2. Erişim ve Atama Metotları (Getters and Setters)
Nesne içindeki özelliklere güvenli bir şekilde erişmek veya değer atamak için kullanılan yerleşik get ve set metotları ES5 ile standart hale geldi.
var user = {
firstName: "John",
lastName : "Doe",
_role : "user",
// Getter
get fullName() {
return this.firstName + " " + this.lastName;
},
// Setter
get role() {
return this._role;
},
set role(value) {
this._role = (value === "admin" || value === "user") ? value : "user";
}
};
console.log(user.fullName); // "John Doe"
user.role = "super-admin"; // Geçersiz rol ataması
console.log(user.role); // "user" (setter tarafından kontrol edildi ve varsayılana çekildi)
3. Object.defineProperty() ve Nesne Koruma
Bir nesneye yeni bir özellik eklerken, bu özelliğin değiştirilip değiştirilemeyeceğini (writable), döngülerde görünüp görünmeyeceğini (enumerable) ve silinip silinemeyeceğini (configurable) hassas bir şekilde belirlememizi sağlar.
const car = {};
Object.defineProperty(car, 'wheels', {
value: 4,
writable: false, // Değeri sonradan değiştirilemez
enumerable: true, // Döngülerde (Object.keys vb.) görünür
configurable: false // Silinemez veya yeniden tanımlanamaz
});
car.wheels = 5; // Hata vermez ama değer değişmez (strict mode'da hata fırlatır)
console.log(car.wheels); // 4
Ayrıca nesneleri tamamen dondurmak veya mühürlemek için şu metotlar eklenmiştir:
Object.freeze(obj): Nesne üzerinde hiçbir değişiklik yapılmasına izin vermez.Object.seal(obj): Yeni özellik eklenmesini ve silinmesini engeller, ancak mevcut özelliklerin değerleri değiştirilebilir.
4. Fonksiyonel Dizi (Array) Metotları
Klasik for döngüleri yerine dizileri bildirimsel (declarative) bir şekilde işlememizi sağlayan metotlar eklendi:
- map(): Dizinin her elemanını işleyip yeni bir dizi döndürür.
- filter(): Belirli bir koşulu sağlayan elemanlardan yeni bir dizi oluşturur.
- reduce(): Dizi elemanlarını tek bir değere indirger.
var prices = [100, 200, 300, 400];
// %20 indirimli fiyatları hesapla
var discounted = prices.map(function(price) {
return price * 0.8;
}); // [80, 160, 240, 320]
// 150 TL üzerindeki fiyatları filtrele
var expensive = prices.filter(function(price) {
return price > 150;
}); // [200, 300, 400]
5. Function.prototype.bind()
Bir fonksiyonun içindeki this bağlamını (context) kalıcı olarak sabitleyip yeni bir fonksiyon kopyası oluşturur. Özellikle asenkron işlemlerde this kayıplarını önlemek için hayat kurtarıcıdır.
const module = {
x: 42,
getX: function() {
return this.x;
}
};
const unboundGetX = module.getX;
console.log(unboundGetX()); // undefined (Scope kayboldu)
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // 42 (Scope module nesnesine sabitlendi)
ES5 vs ES6 Karşılaştırması
| Özellik | ES5 (2009) | ES6 / ES2015 (2015) |
|---|---|---|
| Değişken Tanımlama | Sadece var (Function-scoped) | let ve const (Block-scoped) |
| String Birleştirme | Artı işareti ile ("a" + "b") | Template Literals (Ters tırnak: `a ${b}`) |
| Fonksiyonlar | function ifadesi | Ok Fonksiyonları (Arrow Functions: () => {}) |
| Modül Desteği | Resmi destek yok (CommonJS / AMD) | Yerleşik modül yapısı (import / export) |
| Sınıf Yapısı | Prototip tabanlı nesne türetme | class anahtar kelimesi ve kalıtım (extends) |
Sıkça Sorulan Sorular (FAQ)
ES5 dizi metotları klasik for döngüsünden daha mı yavaştır?
Evet, teknik olarak forEach veya map gibi metotlar her eleman için yeni bir fonksiyon çağrısı (callback) yaptığı için klasik for döngüsüne göre milisaniyeler düzeyinde daha yavaştır. Ancak modern JavaScript motorları (V8 gibi) bu farkı optimize eder. Kodun okunabilirliği ve bakımı kolaylığı için fonksiyonel metotları kullanmak neredeyse her zaman daha iyi bir tercihtir.
JSON.parse() ve JSON.stringify() öncesinde ne kullanılıyordu?
ES5 öncesinde JSON tarayıcılar tarafından yerleşik olarak desteklenmiyordu. Geliştiriciler harici kütüphaneler (Douglas Crockford'un json2.js kütüphanesi gibi) kullanmak ya da güvensiz olan eval() fonksiyonu ile JSON string'lerini çalıştırmak zorunda kalıyorlardı.
Trailing Commas (Sondaki Virgül) neden faydalıdır?
Dizi veya nesnelerin son elemanından sonra bırakılan virgüller ([1, 2, 3,]) ES5 ile geçerli kabul edilmeye başlandı. Bu sayede Git gibi versiyon kontrol sistemlerinde yeni bir eleman eklendiğinde sadece eklenen satır değişmiş görünür, önceki satırın sonuna virgül eklemek için yapılan değişiklik diff kayıtlarını kirletmez.
Resmi Kaynaklar
- ECMA-262 5.1 Edition Standard Specification
- MDN Web Docs: Object.defineProperty()
- MDN Web Docs: Strict Mode
Bu Yazıda Yapılan Değişiklikler
- 20.06.2026: Yazı içeriği tamamen modernize edildi. Hatalı syntax içeren eski getter/setter ve defineProperty kod örnekleri düzeltildi. ES5 vs ES6 karşılaştırma tablosu, performans ve JSON tarihi hakkında SSS (FAQ) alanları ve LLO geliştirmeleri eklendi.
- 11.05.2022: Başlıklardaki görsel hatalar düzeltildi. Özet bölümü düzenlendi.
