Onur Dayıbaşı

CV
none

Shallow/Deep Copy Nedir ?

Array ve Object Kopyalama Örneği

Aşağıdaki örneklerde array ve objeleri spread operatörü ile clone oluşturabilirsiniz.

1const arr1=[1,2]; const arr2=[...arr1]; arr1.push(3);
2console.log(arr2);
3const obj1={a:1,b:2}; const obj2={...obj1}; obj1['c']=3;
4console.log(obj2);

Nesneyi Kopyalama Yöntemleri(Shallow/Deep Copy)

Shallow(Sığ) kopyalama esnasında sadece first-level (birincil) hiyerarşideki değerleri kopyalar. Spread operatörü’ de bu kopyalamaya göre çalışır.

1let obj = { a: [1, 2, {users: [{ name: ‘onur’, age: 12 }] }], b:2 };
2const cloneObj={…obj}; //same => Object.assign({}, obj);
3obj.a[2].users[0].name=’deniz’;
4obj.b=4;
5console.log(cloneObj);//Result interesting..
6//cloneObj.b is 2 not 4 because it clones first level and cloneObj holds a new memory location for b
7//but cloneObj.a[2].users[0].name is 'deniz' why because it hold reference cloning is not deeply.

Deep(Derinlemesine) kopyalama ise bütün alt hiyerşileri gezip her bir değeri kopyalar bu zahmetli ve uğlaştırıcıdır ama referansların birbirini etkilememesi için deep copy zorunludur.

  1. Serialize/Deserialize : Hızlı kopyalama için — JSON.parse/stringify kullanabilirsiniz.
  2. lodash.clonedeep
1const clonedeep = require('lodash.clonedeep')
  1. Recursive olarak nesneyi dolaşarak birbirine atama yaparak kopyalama yapabilirsiniz.
1function clone(obj) {
2 if (obj === null || typeof (obj) !== 'object' || 'isActiveClone' in obj)
3 return obj;
4 if (obj instanceof Date)
5 var temp = new obj.constructor(); //or new Date(obj);
6 else
7 var temp = obj.constructor();
8 for (var key in obj) {
9 if (Object.prototype.hasOwnProperty.call(obj, key)) {
10 obj['isActiveClone'] = null;
11 temp[key] = clone(obj[key]);
12 delete obj['isActiveClone'];
13 }
14 }
15 return temp;
16}

Referanslar