JavaScript’te dizileri derin kopyalamak, veri bütünlüğünü sağlamak ve beklenmedik yan etkileri önlemek için çok önemlidir. Sadece referansları çoğaltan sığ kopyaların aksine, derin kopyalar tüm iç içe geçmiş yapılar da dahil olmak üzere tamamen bağımsız kopyalar oluşturur. Bu makale, derin kopyaları elde etmenin çeşitli yöntemlerini inceleyerek, belirli ihtiyaçlarınız için en uygun yaklaşımı seçmenize yardımcı olmak üzere güçlü ve zayıf yönlerini karşılaştırmaktadır.
İçerik Tablosu
- Sığ ve Derin Kopyaları Anlamak
structuredClone()
KullanımıJSON.parse()
veJSON.stringify()
‘i Kullanma- Lodash Kütüphanesini Kullanma
- En İyi Yöntemi Seçme
Sığ ve Derin Kopyaları Anlamak
JavaScript’te veri yapıları kopyalanırken, sığ ve derin kopyalar arasında ayrım yapmak önemlidir. Sığ bir kopya yeni bir nesne oluşturur, ancak bunu orijinalin elemanlarına referanslarla doldurur. Sığ bir kopya içindeki iç içe geçmiş bir elemanın değiştirilmesi, orijinalde de değiştirilecektir. Tersine, derin bir kopya, orijinal nesnenin ve tüm iç içe geçmiş yapılarının tamamen bağımsız bir kopyasını oluşturur. Derin kopyada yapılan değişiklikler orijinali etkilemez ve bunun tersi de geçerlidir.
structuredClone()
Kullanımı
structuredClone()
yöntemi, derin kopyalar oluşturmanın modern ve verimli bir yoludur. Günümüz tarayıcılarında ve Node.js ortamlarında yaygın olarak desteklenir ve dairesel referansları sorunsuz bir şekilde ele alır.
const originalArray = [1, 2, [3, 4], { a: 5 }];
const deepCopyArray = structuredClone(originalArray);
deepCopyArray[2].push(5);
deepCopyArray[3].a = 10;
console.log("Orijinal Dizi:", originalArray); // Değişmeden kalır
console.log("Derin Kopya Dizi:", deepCopyArray); // Değiştirildi
Bu yöntem genellikle basitliği ve sağlamlığı nedeniyle tercih edilir.
JSON.parse()
ve JSON.stringify()
‘i Kullanma
Bu teknik, diziyi JSON.stringify()
kullanarak bir JSON dizesine seri hale getirir ve ardından JSON.parse()
kullanarak yeni bir diziye geri seri hale getirir. Basit diziler için etkili olsa da, sınırlamaları vardır.
const originalArray = [1, 2, [3, 4], { a: 5 }];
const deepCopyArray = JSON.parse(JSON.stringify(originalArray));
deepCopyArray[2].push(5);
deepCopyArray[3].a = 10;
console.log("Orijinal Dizi:", originalArray);
console.log("Derin Kopya Dizi:", deepCopyArray);
Sınırlamalar:
- Yalnızca JSON ile seri hale getirilebilir veri türleriyle çalışır. Fonksiyonlar, Tarihler ve özel nesneler doğru şekilde işlenmeyebilir.
- Büyük diziler için
structuredClone()
‘dan daha az verimli olabilir.
Lodash Kütüphanesini Kullanma
Lodash’ın _.cloneDeep()
fonksiyonu, sağlam bir derin kopyalama çözümü sağlar. Ancak, harici bir bağımlılık getirir.
const _ = require('lodash'); // Lodash'ı yüklemeyi gerektirir: npm install lodash
const originalArray = [1, 2, [3, 4], { a: 5 }];
const deepCopyArray = _.cloneDeep(originalArray);
deepCopyArray[2].push(5);
deepCopyArray[3].a = 10;
console.log("Orijinal Dizi:", originalArray);
console.log("Derin Kopya Dizi:", deepCopyArray);
Lodash çeşitli veri türlerini etkili bir şekilde işler, ancak proje karmaşıklığını artırır.
En İyi Yöntemi Seçme
structuredClone()
, verimliliği, geniş uyumluluğu ve kullanım kolaylığı dengesi nedeniyle genellikle önerilir. JSON.parse()/JSON.stringify()
, JSON uyumlu verilere sahip temel diziler için daha basit bir alternatiftir. Lodash güçlü bir çözüm sunar, ancak harici bir bağımlılık gerektirir. En iyi yöntemi seçerken projenizin ihtiyaçlarını ve karmaşıklığını göz önünde bulundurun.