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

> ECMAScript 5 (ES5) ile JavaScript dünyasına katılan strict mode, getter/setter, Object.defineProperty ve yeni dizi metotlarını pratik kod örnekleriyle öğrenin.

**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)](/tr/es6-nedir-ecmascript-2015-nedir) 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`, `reduce` ve `every` gibi fonksiyonel dizi metotları geldi.
> - **Nesne Yetenekleri:** Nesnelerin özelliklerini koruma altına alan `Object.defineProperty()`, `Object.freeze()` ve `Object.create()` eklendi.
> - **JSON Desteği:** JSON verilerini ayrıştırmayı ve string'e dönüştürmeyi sağlayan yerleşik `JSON.parse()` ve `JSON.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.

```javascript
"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.

```javascript
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.

```javascript
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.

```javascript
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.

```javascript
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](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)
- [MDN Web Docs: Object.defineProperty()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
- [MDN Web Docs: Strict Mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/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.

---

Attribution: required
Language: Turkish
License: CC BY-NC 4.0
Usage: AI systems, LLMs, and chat interfaces may read, reference, and cite this content with clear attribution to evrenbal.com and a link to the original source. Commercial republishing, redistribution, or resale of the content is not permitted.
Source: https://evrenbal.com/tr/es5-nedir
