JavaScript'ta Shallow Copy vs Deep Copy
JavaScript, veri tipine bağlı olarak kopyalama işlemini iki şekilde gerçekleştirir.
İlkel Değerler (Copy by Value)
İlkel türler; string, number, boolean, symbol, bigInt ve null değerlerini içerir. Bir ilkel değeri kopyaladığınızda, JavaScript bellekte yeni ve bağımsız bir versiyon oluşturur.
Örnek:
let a = 10;
let b = a;
b = 20;
Sonuç: a değeri 10 olarak kalır.
İlkel Olmayan Değerler (Copy by Reference)
Nesneler (objects) ve diziler (arrays) farklı çalışır. Bunlar referansları kullanır. Bir nesneyi kopyaladığınızda, yalnızca bellekteki konumuna işaret eden göstergeyi (pointer) kopyalamış olursunuz.
Örnek:
let original = { name: "YOO" };
let copy = original;
copy.name = "NEW";
Sonuç: original.name artık "NEW" oldu.
Fark: Shallow vs Deep
Shallow copy (sığ kopyalama), bir nesnenin sadece en üst seviyesini kopyalar. Eğer nesne iç içe geçmiş (nested) nesnelere sahipse, bu iç içe nesneler hala orijinal referanslara işaret eder. Deep copy (derin kopyalama) ise, tüm değerlerin yeni olduğu tamamen yeni bir nesne oluşturur.
Bunu bir pizza gibi düşünün:
- Shallow Copy: Bir arkadaşınızla bir pizzayı paylaşıyorsunuz. Arkadaşınız bir dilim yerse, pizza sizin için de küçülmüş olur.
- Deep Copy: İkinizin de kendine ait ayrı pizzaları var. Arkadaşınız bir dilim yerse, sizin pizzanız aynı kalır.
Shallow Copy Yöntemi
Shallow copy yapmak için spread operatörünü (...) kullanabilirsiniz.
let original = { name: "YOO", details: { age: 22 } };
let copy = { ...original };
Uyarı: Eğer original.details.age değerini değiştirirseniz, copy.details.age değeri de değişir. Bu, shallow copy tuzağıdır.
Deep Copy Yöntemleri
1. structuredClone()
Bu, modern tarayıcılarda ve Node.js'de bulunan yerleşik bir fonksiyondur. İç içe geçmiş yapıları mükemmel bir şekilde yönetir.
Avantajları:
- Hızlı ve yerleşiktir (native).
- Date, RegExp ve Map yapılarını işleyebilir.
Dezavantajları:
- Nesne fonksiyonlar veya DOM düğümleri içeriyorsa hata verir.
2. JSON.parse(JSON.stringify())
Bu, bir nesneyi önce bir string'e, sonra tekrar bir nesneye dönüştürdüğünüz eski bir yöntemdir.
Neden kaçınılmalı:
undefined,Map,SetveyaInfinitygibi verileri kaybeder.- Belirli değerleri bozabilir.
Kaynak: https://dev.to/yogesh_992/shallow-copy-vs-deep-copy-in-java-script-explained-in-easiest-way-3dg5
