Javascript’te Immutable ve Mutable Konusu
23 Eki, 2024 • 14 görüntülenmeEğer öğrenmek istediğim bir konu olursa bunu ezberden ziyade pratikte olmasını isterim. Bundan dolayı bazı teknik ve terimsel konularda bilgi eksikliğim çok fazla. Bu zamanlarda bunların üstüne giderek kendimi geliştirmeye çalışıyorum. Bu yeni süreçte öğrendiklerimi not tutuyorum ama neden blogumda yazmıyorum diye sordum ve buradayım.
Aslında immutable ve mutable değerler birbirinin tersidir. Değişmez ve değişebilir olarak Türkçe’ye çevirebiliriz. Hadi gelin örneklerle daha iyi anlayalım.
const dizi = [1,2,3,4];
const yeniDizi = dizi;
yeniDizi.push(5);
console.log(dizi) // [1,2,3,4,5]
console.log(yeniDizi) // [1,2,3,4,5]
Burada dizi değişkenini yeniDizi değişkenine aktarırken değerlerin yanında referansını da aktarmış oluyoruz. Yani şöyle anlatayım. dizi değişkeni aslında RAM’de bir alana kayıtlı. Ben eğer bunu yeniDizi’ye aktardığımda RAM’deki alanı da aktarmış oluyorum. O yüzden yeniDizi’ye yeni bir değer eklerken dizi’ye de eklemiş oluyorum. Bu aslında mutable konusuna bir örnek olmuş oldu.
Gerçek hayatta bu durum ile çok fazla karşılaşıyoruz. Zaman zaman bu problemi çözmek için arayış içine girip duruyoruz. Çözüyoruz da bunu ama tekrar karşımıza çıktığında yine araştırmamız gerekiyor. Şimdi sizinle bunu nasıl çözeceğimize daha derinden ve birkaç yöntemden bahsedeceğim. Ama öncesinde gelin hangi array fonksiyonlarınınmutable yarattığına bakalım.
- .pop()
- .push()
- .shift()
- .unshift()
- .reverse()
- .sort()
- .splice()
Mutasyon yaratmayan yani immutable olan fonksiyonlar ise;
- .slice()
- .concat()
- .map()
- .filter()
- .redue()
- .find()
Bazı yöntemlerle mutasyona uğrayan durumlarda bunu önlemek için bazı teknikleri kullanabiliriz. Bunları teker teker açıklamayacağım çünkü baktığınız zaman kolay bir şekilde anlayabilirsiniz.
Pop
const pop = arr => arr.slice(0,-1);
Push
const push = (arr, value) => [...arr,value];
Shift
const shift = arr => arr.slice(1);
Unshift
const unshift = (arr,value) => [value,...arr];
Reverse
const reverse = arr => [...arr].reverse();
Kesin çözüm (mutasyonu önermek için)
const arr = [1,2,3,4,5,6]
const copy = [...arr] // istediğin işlemi copy değişkeni ile yapabilirsin.
Bazı konuları ne kadar okusan da dinlesen de bazı noktaları kaçırabiliyoruz. Bu noktada yazarak veya anlatarak emin olamadığımız yerleri daha derinden düşünebiliyoruz. Şu an yaşadığım şey bu.
Bir sonraki yazılarda görüşmek dileğiyle…