JavaScript öğrenen pek çok kişi, const
kelimesini gördüğünde bu değişkenin tamamen sabit olduğunu, yani bir daha asla değiştirilemeyeceğini düşünür. Bu düşünce, ilk etapta doğrudur ama yalnızca basit değerler (sayılar, metinler gibi) için geçerlidir. Konu dizilere (ve nesnelere) geldiğinde durum biraz daha farklıdır. Bu makalede, const
ile tanımlanan dizilerin neden değiştirilebildiğini detaylı bir şekilde açıklayacağız. Konuya özellikle yeni başlayan öğrencilerin anlayabileceği şekilde yaklaşacağız.
const
ile Tanımlanan Değişkenler Değiştirilemez mi?
Öncelikle temel bilgiyle başlayalım. Aşağıdaki örneği inceleyelim:
const okulAdi = "Atatürk Lisesi";
okulAdi = "Cumhuriyet Lisesi"; // HATA!
Bu örnekte const
ile tanımlanan okulAdi
adlı değişkene daha sonra başka bir değer atamak (reassignment) mümkün değildir. JavaScript bu durumda bir hata verir çünkü const
, tanımlanan değişkenin değerinin yeniden atanmasını engeller.
Peki Ya Diziler?
Şimdi konuyu dizilere taşıyalım:
const ogrenciler = ["Ayşe", "Mehmet", "Ali"];
Buraya kadar her şey normal görünüyor. Ama şimdi bu dizinin içeriğini değiştirmeye çalışalım:
ogrenciler.push("Zeynep");
ogrenciler[1] = "Mustafa";
Bu iki işlem de hata vermez. Yani const
ile tanımladığımız halde dizinin içine yeni eleman ekleyebiliyoruz veya mevcut elemanları değiştirebiliyoruz. Bu nasıl mümkün oluyor?
Dizilerde Asıl Korunan Şey: Referans
Cevap, dizilerin JavaScript’te nasıl çalıştığıyla ilgili. Basit veri tiplerinde (sayı, metin, boolean gibi) değişkenin tuttuğu değer, doğrudan o değişkende saklanır. Ama diziler gibi karmaşık veri yapılarında durum farklıdır: Değişkenin tuttuğu şey, dizinin kendisi değil, dizinin bellekteki yeri (adres ya da referans) olur.
const kitaplar = ["1984", "Hayvan Çiftliği"];
Bu örnekte kitaplar
, aslında dizinin bellekteki adresini saklar. Biz bu adresi değiştirmediğimiz sürece, dizinin içeriğini değiştirmekte özgürüz. Yani const
burada referansı sabitler, içeriği değil.
Referansı Değiştirmeye Çalışırsak Ne Olur?
Şimdi aynı diziye tamamen başka bir dizi atamaya çalışalım:
kitaplar = ["Kuyucaklı Yusuf", "Tutunamayanlar"]; // HATA!
İşte burada hata alırız. Çünkü artık bellekteki başka bir diziye yeni bir referans atamaya çalışıyoruz. Bu da const
kurallarına aykırı. JavaScript bunu engeller.
Neden Böyle Bir Şeye İzin Veriliyor?
Bu yapı, uygulamalarda veri güvenliğini sağlar. Örneğin bir mesajlaşma uygulaması yaptığınızı düşünün. Elinizde kullanıcıların yazdığı mesajları tutan bir dizi olsun:
const mesajlar = [];
Kullanıcı mesaj attıkça bu diziye yeni elemanlar ekleyeceksiniz. Ama bu dizinin kendisinin tamamen değişmesini istemezsiniz. Yani dizinin içerikleri değişebilir ama mesaj listesi referans olarak aynı kalmalıdır. Böylece uygulamanız daha kararlı ve öngörülebilir olur.
Gerçek Hayattan Bir Benzetme
Bir kutu düşünün. Kutunun içinde kitaplar var. Kutuyu const
ile tanımladığınızda, bu kutunun kendisi sabitlenmiş olur. Ama kutunun içindeki kitapları değiştirmek, yenilerini eklemek veya çıkarmak serbesttir. Kutuyu tamamen alıp başka bir kutuyla değiştirmeye çalıştığınızda ise sistem buna izin vermez.
const kutu = ["Fizik", "Kimya"];
kutu.push("Biyoloji"); // Sorun yok
kutu[0] = "Matematik"; // Sorun yok
kutu = ["Edebiyat", "Tarih"]; // HATA!
Özetle
const
ile tanımlanan dizinin kendisi (yani referansı) değiştirilemez.
- Ama dizinin içeriği (elemanları) rahatlıkla değiştirilebilir.
- Bu, JavaScript’te karmaşık veri yapılarının kontrolünü kolaylaştırır.
- Kodun güvenliğini artırır ve programın beklenmedik şekilde bozulmasını önler.
Yeni başlayan biri olarak bu farkı anlaman çok önemli. Çünkü JavaScript’te dizilerle çalışırken neden bazı işlemlerin çalıştığını, bazılarının ise hata verdiğini anlamak ancak bu “referans” mantığını kavramakla mümkün olur.
Unutma: const
ile tanımlanan bir dizi, içi değiştirilebilen ama kabuğu sabit kalan bir kaptır. Bu kaptan istediğin kadar malzeme çıkarıp koyabilirsin ama kabın kendisini atıp yerine başka bir kap koyamazsın.