Nesne referansları ve kopyalama #12

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, […]

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:

image 2021 10 10 142556

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:

image 2021 10 10 142602

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.

image 2021 10 10 142617

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:

image 2021 10 10 142623

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:

image 2021 10 10 142639

Ayrıca bunun için Object.assign yöntemini kullanabiliriz.

Sözdizimi:

image 2021 10 10 142644

İ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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir