JavaScript’te nesneleri kopyalamak için genellikle üç seçeneğiniz vardır: assignment operator (=)
referans amaçlı kopyalamayı kullanmak, Object.assign()
veya gibi yöntemleri kullanarak spread operator (...)
sığ bir kopya gerçekleştirmek ve JSON.parse() and JSON.stringify()
.
1. Referans Kopyası (Atama Operatörü =):
1 2 | const originalObject = { key: 'value' }; const referenceCopy = originalObject; |
Bu yöntemde, referenceCopy artık orijinalObject ile aynı nesneye işaret ediyor. Birinde yapılan değişiklik diğerini de etkileyecektir. Bu yöntem orijinal nesneye bir referans oluşturur. Orijinal nesnede yapılan değişiklikler kopyalanan nesneye yansıtılacaktır ve bunun tersi de geçerlidir. Bu gerçek bir kopya değil; bunun yerine her iki değişken de aynı nesneye işaret eder.
2. Sığ Kopya (Shallow):
A. Object.sign()’ı kullanma:
1 2 | const originalObject = { key: 'value' }; const shallowCopy = Object.assign({}, originalObject); |
Object.assign()
nesnenin sığ bir kopyasını oluşturur. Numaralandırılabilir özellikleri bir veya daha fazla kaynak nesneden bir hedef nesneye kopyalar. Yukarıdaki örnekte boş bir nesne {}
hedef görevi görür ve originalObject
kaynaktır. Yuvalanmış nesnelere hâlâ referans verildiğini, dolayısıyla orijinaldeki yuvalanmış nesnelerde yapılan değişikliklerin kopyalanan nesneyi etkileyeceğini unutmayın.
B. Spread Operatörünü Kullanma (…):
1 2 | const originalObject = { key: 'value' }; const shallowCopy = { ...originalObject }; |
Yayılma operatörü, nesnelerin yüzeysel kopyalarını oluşturmanın kısa bir yoludur. gibi Object.assign()
, yalnızca üst düzey özelliklerin bir kopyasını oluşturur. İç içe geçmiş nesnelere hâlâ başvurulmaktadır, dolayısıyla orijinaldeki iç içe geçmiş nesnelerde yapılan değişiklikler kopyalanan nesneyi etkileyecektir.
Bu yöntemlerin her ikisi de nesnenin yalnızca üst düzey özelliklerini kopyalayarak yüzeysel bir kopya oluşturur. Yuvalanmış nesnelerde yapılan değişiklikler hem orijinale hem de kopyaya yansıtılacaktır.
3. Derin Kopya (Deep):
JSON.parse() ve JSON.stringify()’ı kullanma
1 2 3 4 | const originalObject = { key: 'value', nested: { key2: 'value2' } }; // Using JSON.parse() and JSON.stringify() const deepCopy = JSON.parse(JSON.stringify(originalObject)); |
Bu yöntem, iç içe geçmiş yapılar da dahil olmak üzere nesnenin derin bir kopyasını oluşturur. Bu yaklaşımın, JSON açısından güvenli olmayan verileri korumama ve büyük veya karmaşık nesneler için daha az verimli olma gibi sınırlamaları olduğunu unutmayın.
Özel koşullarınıza bağlı olarak uygun yaklaşımı seçin:
- Referans Kopyası (=): Her iki değişkenin de aynı nesneye referans vermesini istediğinizde kullanın.
- Sığ Kopya (Object.sign() veya Spread Operator): Üst düzey özelliklerin bir kopyasına ihtiyaç duyduğunuzda ve iç içe geçmiş nesnelerin paylaşılmasıyla ilgilenmediğinizde kullanın.
- Derin Kopya (JSON.parse() ve JSON.stringify()): İç içe yapılar da dahil olmak üzere tamamen bağımsız bir kopyaya ihtiyaç duyduğunuzda kullanın. JSON açısından güvenli olmayan verilerle ilgili sınırlamalara karşı dikkatli olun.
Örneklere bir bakış
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | let product = { id: 1, name: 'Smartphone', price: 499.99, details: { brand: 'TechCo', model: 'SmartX1', specifications: { display: '6.2 inches', camera: '12 MP', storage: '64 GB' } } }; // Yayılma operatörünü kullanarak sığ kopyalama let copiedProduct = { ...product }; copiedProduct.name = 'Smartwatch'; // Disconnected // İç içe geçmiş nesnedeki değişiklikler bağlantılıdır copiedProduct.details.model = 'WatchPro'; copiedProduct.details.specifications.display = '1.3 inches'; console.log("Shallow Copy - Copied Product:", copiedProduct); console.log("Shallow Copy - Original Product:", product); // Derin Kopya Örneği let productDeep = { id: 1, name: 'Smartphone', price: 499.99, details: { brand: 'TechCo', model: 'SmartX1', specifications: { display: '6.2 inches', camera: '12 MP', storage: '64 GB' } } }; // JSON yöntemlerini kullanarak derin kopyalama let copiedProductDeep = JSON.parse(JSON.stringify(productDeep)); copiedProductDeep.name = 'Laptop'; // Disconnected // İç içe geçmiş nesnedeki değişikliklerin de bağlantısı kesilir copiedProductDeep.details.model = 'LaptopPro'; copiedProductDeep.details.specifications.display = '15.6 inches'; console.log("Deep Copy - Copied Product:", copiedProductDeep); console.log("Deep Copy - Original Product:", productDeep); |