Başlangıç dosyalarını bulabileceğiniz repom: js-30 | github
Javascript'te iki çesit veri tipi bulunmaktadir: Primitive ve non-primitive(reference).
Primitive veri tipindeki değerleri kopyalamak oldukça basit olsa da Array ve Objeler reference bazlı veri tipleri olduğundan kopyalama işlemleri kafa karıştırıcı olabiliyor.
Primitive bir veri tipi olan stringi kopyalamayla başlayalım.
Bu beklenen davranış diğer primitive veri tipleri(boolean,number vs.) için de geçerli.
Array kopyalama
Aynı kopyalama işlemini primitive olmayan array ile deneyelim:
Görüleceği gibi orijinal arraydeki 3. elemanda güncellendi! Bunun sebebi arrayi kopyalarken aslında arrayin kendisini değil referansını kopyaladık. Her iki array aynı referansa işaret ettiğinden herhangi birini güncellediğimizde bu diğerini de etkiliyor.
Bu durumu çözmek için;
Eski usül [].slice() metodunu kullanabiliriz. Slice metodunu parametresiz çalıştırınca bize orijinal arrayi olduğu gibi dönecektir ancak bu yeni bir array olacaktır ve referansı farklı olduğundan yapılan değişikliklerden orijinal array etkilenmeyecektir.
concat metodu ile boş bir arraye kopyalamak istediğimiz arrayi ekleyebiliriz.
Daha modern bir yöntem olarak ise ES6 ile gelen spread syntaxını kullanabiliriz.
Object kopyalama
Objeler de non-primitive veri tipidir dolayısıyla kopyalama yaparken aynı problemle karşılaşırız.
Bu davranıştan kurtulmak ve objeyi gerçekten kopyalamak için:
Object.assign kullanabiliriz.
ES6 ile gelen spread syntaxını kullanabiliriz.
Gerek Object gerekse de Array kopyalamak için verilen yöntemlerin yalnızca 1 seviye derinliğinde olduğunu unutmayın. Yani örneğin arrayiniz içinde başka bir array/object varsa ve yukarıdaki yöntemlerle kopyalama yaparsanız referansları aynı olacak ve hatalarla karşılaşma ihtimaliniz olacaktır.
Bundan kaçınmak için internette bulabileceğiniz cloneDeep metodlarını kullanmalısınız.