Nesnelerin ilkellere göre temel farklarından biri, nesnelerin “referans yoluyla” saklanması ve kopyalanması, oysa ilkel değerlerin: dizeler, sayılar, booleanlar, vb. – her zaman “bütün bir değer olarak” kopyalanmasıdır.
Bir değeri kopyaladığımızda ne olduğuna dair kaputun biraz altına bakarsak bunu anlamak kolaydır.
Bir dize gibi bir ilkel ile başlayalım.
Burada mesajın bir kopyasını ifadeye koyuyoruz:
Sonuç olarak, her biri “Merhaba!” dizesini depolayan iki bağımsız değişkenimiz var.
Bir nesneye atanan bir değişken, nesnenin kendisini değil, onun “bellekteki adresini”, başka bir deyişle ona “bir referansı” depolar.
Böyle bir değişkenin bir örneğine bakalım:
Nesne bellekte bir yerde (resmin sağında) saklanırken, kullanici değişkeninin (solda) ona bir “referansı” vardır.
kullanici gibi bir nesne değişkenini, üzerinde nesnenin adresi olan bir kağıt yaprağı gibi düşünebiliriz.
Nesneyle eylemler gerçekleştirdiğimizde, ör. bir kullanici.adi özelliği alın, JavaScript motoru o adreste ne olduğuna bakar ve işlemi gerçek nesne üzerinde gerçekleştirir.
Şimdi bu neden önemli.
Referansa göre karşılaştırma
İki nesne ancak aynı nesneyse eşittir.
Örneğin, burada a ve b aynı nesneye başvurur, dolayısıyla eşittirler:
Ve burada iki bağımsız nesne birbirine benzeseler de (her ikisi de boş) eşit değildir:
obj1 > obj2 gibi karşılaştırmalar veya ilkel bir nesne == 5 ile karşılaştırma için nesneler ilkellere dönüştürülür. Nesne dönüşümlerinin nasıl çalıştığını çok yakında inceleyeceğiz, ancak gerçeği söylemek gerekirse, bu tür karşılaştırmalara çok nadiren ihtiyaç duyulur – genellikle bir programlama hatasının sonucu olarak ortaya çıkarlar.
Klonlama ve birleştirme, Object.assign
Bu nedenle, bir nesne değişkenini kopyalamak, aynı nesneye bir referans daha oluşturur.
Peki ya bir nesneyi çoğaltmamız gerekirse? Bağımsız bir kopya, bir klon mu yaratıyorsunuz?
Bu da yapılabilir, ancak biraz daha zor çünkü JavaScript’te bunun için yerleşik bir yöntem yok. Ancak nadiren ihtiyaç duyulur – referansla kopyalamak çoğu zaman iyidir.
Ancak bunu gerçekten istiyorsak, o zaman yeni bir nesne yaratmamız ve var olanın yapısını, özelliklerini yineleyerek ve bunları ilkel düzeyde kopyalayarak çoğaltmamız gerekir.
Bunun gibi:
Ayrıca bunun için Object.assign yöntemini kullanabiliriz.
Sözdizimi:
İlk argüman hedef bir hedef nesnedir. Diğer argümanlar src1, …, srcN (gerektiği kadar çok olabilir) kaynak nesnelerdir. Tüm kaynak nesnelerin src1, …, srcN özelliklerini hedef hedefe kopyalar. Başka bir deyişle, ikinciden başlayan tüm argümanların özellikleri ilk nesneye kopyalanır.
Çağrı hedef döndürür.