
Bu rehber, javascript başlangıç kodları yazmaya başlarken en kritik iki konuyu netleştirir: değişkenler (var/let/const) ve veri tipleri (primitifler ve nesneler). Amaç; ezber yapmak değil, küçük örneklerle “neden böyle?” sorusuna cevap vererek hızlıca pratik yapabilmeniz.
Yazı boyunca, dilin temel davranışları için MDN veri tipleri rehberi, MDN let açıklaması, resmi tanım için ECMAScript (ECMA-262) spesifikasyonu ve öğrenme odaklı özet için web.dev referans alınır.
Değişken, bir değeri isimle tutmanıza yarar. JavaScript’te değişken tanımlamak için en yaygın üç anahtar kelime vardır: var, let, const. Farkları yalnızca “yeniden atama olur mu?” değil; aynı zamanda kapsam (scope) ve bazı sürprizleri azaltan kurallarla ilgilidir.
| Özellik | var | let | const |
|---|---|---|---|
| Kapsam (scope) | Fonksiyon kapsamı (function scope) | Blok kapsamı (block scope) | Blok kapsamı (block scope) |
| Yeniden tanımlama (aynı isimle) | Genelde mümkün | Aynı kapsam içinde mümkün değil | Aynı kapsam içinde mümkün değil |
| Yeniden atama | Mümkün | Mümkün | Mümkün değil (binding sabit) |
| Hoisting / TDZ | Hoisting davranışı daha “esnek” görünür | TDZ nedeniyle erken erişimde hata görülebilir | TDZ nedeniyle erken erişimde hata görülebilir |
Bu davranışların ayrıntıları için MDN’nin let açıklaması özellikle kapsam (scope), yeniden tanımlama ve Temporal Dead Zone (TDZ) başlıklarında net örnekler verir.
Blok, genellikle süslü parantez içidir: { ... }. let ve const blok kapsamlıdır; yani sadece tanımlandıkları blok içinde erişilebilirler. var ise fonksiyon kapsamlıdır; blok içine yazılsa bile çoğu durumda fonksiyonun tamamından erişilebilir gibi davranır. (Detaylar: MDN)
JavaScript motoru, bazı bildirimleri çalıştırma sırasında farklı bir şekilde ele alır; bu davranış pratikte “hoisting” olarak anılır. let ve const için önemli nokta: Bildirim satırından önce erişmeye çalışırsanız, TDZ nedeniyle ReferenceError görebilirsiniz. (Kaynak: MDN let)
Kod örneği:
// TDZ örneği
console.log(x); // ReferenceError (x bildirilmeden önce)
let x = 10;
// var örneği (davranış farklı görünebilir)
console.log(y); // undefined (bildirim önce, atama sonra yapılır gibi görünür)
var y = 10;
Not: Buradaki amaç “hangi satır ne verir?” ezberi değil; okunabilirlik ve sürprizleri azaltmak. Bu nedenle modern anlatımlarda var yerine let/const kullanımı daha yaygındır. (Bkz. MDN, web.dev)
JavaScript’te veri tiplerini iki büyük grupta düşünmek işinizi kolaylaştırır:
Primitif türlerin listesi (Number, String, Boolean, null, undefined, BigInt, Symbol) ve nesne/primitive ayrımı, dilin resmi tanımı (ECMA-262) ve eğitim dokümanlarında (ör. web.dev, MDN) tutarlı şekilde anlatılır.
Bu türlerin kavramsal tanımı ve örnekleri için: MDN Data structures ve web.dev Data types.
Nesneler, JavaScript’te “kompleks yapı” denince merkezde yer alır. Diziler (Array) de JavaScript’te nesnenin özel bir türü olarak ele alınır. (Kaynak: MDN)
Kod örneği:
const user = { name: "Ada", age: 28 };
const scores = [10, 20, 30];
console.log(user.name); // "Ada"
console.log(scores[0]); // 10
Yeni başlayanların en sık karıştırdığı nokta şudur: const, değişken ismine (binding) yeniden atamayı engeller; fakat eğer const ile tuttuğunuz değer bir nesne veya dizi ise, içeriğini değiştirebilirsiniz. (Kaynak: MDN)
Kod örneği:
const profile = { city: "Austin" };
profile.city = "Seattle"; // mümkün: nesnenin içeriği değişir (mutasyon)
// profile = { city: "Miami" }; // TypeError: const değişkene yeniden atama yapılamaz
Bu ayrım; kopyalama, karşılaştırma ve fonksiyonlara parametre geçirme davranışlarını anlamayı kolaylaştırır. MDN, primitif ve nesne ayrımını bu zihinsel modelle açıklamayı önerir. (Kaynak: MDN Data structures)
Kod örneği:
// Primitif: kopya (değer) gibi davranır
let a = 5;
let b = a;
b = 6;
console.log(a); // 5
console.log(b); // 6
// Nesne: aynı referansı paylaşabilirsiniz
const obj1 = { n: 1 };
const obj2 = obj1;
obj2.n = 2;
console.log(obj1.n); // 2 (obj1 ve obj2 aynı nesneyi işaret ediyor)
Pratik öneri: Yeniden atama yapmayacaksanız const kullanmak, kodu okuyan kişiye “bu isim başka bir değere dönmeyecek” mesajı verir. Yeniden atama gerekiyorsa let kullanın. (Kaynak: MDN, web.dev)
Aşağıdaki örnekler, “en çok kullanılan” temel desenleri gösterir. Buradaki amaç, küçük parçalarla kas hafızası kazanmaktır.
Kod örneği:
let count = 0;
count = count + 1;
count += 1;
console.log(count); // 2
Kod örneği:
const siteName = "Example";
// siteName = "New"; // TypeError: yeniden atama yapılamaz
console.log(siteName); // "Example"
Kod örneği:
const firstName = "Ada";
const lastName = "Lovelace";
const fullName = firstName + " " + lastName;
console.log(fullName); // "Ada Lovelace"
Genel bir kural gibi düşünebilirsiniz: undefined genelde “henüz değer yok”, null ise “bilerek boş” anlamına gelecek şekilde kullanılır. (Bkz. MDN, web.dev)
Kod örneği:
let aValue;
console.log(aValue); // undefined
const bValue = null;
console.log(bValue); // null
Kod örneği:
const tasks = ["Read", "Practice", "Build"];
tasks.push("Review"); // dizi içeriği değişebilir
console.log(tasks.length); // 4
Kod örneği:
const product = { id: 1, name: "Keyboard", price: 49.99 };
product.price = 44.99; // mutasyon mümkün
console.log(product); // { id: 1, name: "Keyboard", price: 44.99 }
Hayır. Resmi dil tanımı var’ı “kaldırılmış” saymaz; ancak modern kod tabanlarında let/const daha çok tercih edilir çünkü blok kapsamı ve TDZ gibi kurallar bazı sürprizleri azaltmaya yardımcı olur. (Kaynak: MDN)
const, değişken adına yeniden atamayı engeller. Nesne/dizi gibi yapılarda içerik değişebilir. Gerçek “derin değişmezlik” (deep immutability) ayrı teknikler gerektirir ve bu rehberin kapsamı dışındadır. (Kaynak: MDN)
Çünkü bu ayrım, kopyalama ve karşılaştırma davranışlarını etkiler. Primitifler tek bir değer gibi davranırken nesneler çoğu senaryoda aynı referans üzerinden taşınır. (Kaynak: MDN)
Not: JavaScript, zaman içinde güncellenen bir dildir. En kesin teknik tanım her zaman güncel ECMA-262 sürümüdür; öğretici kaynaklar ise bu davranışları daha anlaşılır hale getirir.
Yorumlar