JavaScript’teki İlkel Değerler, Nesneler ve Referanslar Basitleştirildi

0
16

İlkel veri türleri, değerler, nesneler ve referanslar JavaScript’teki en yanlış anlaşılan konular arasındadır. Çok fazla baş ağrısına neden olabilirler. Bu eğitimde, ilkel veri türleri, değerler, nesneler, referanslar, aralarındaki farklar ve nasıl çalıştıkları hakkında bilgi edineceksiniz.

Kısa bir giriş

JavaScript’te birlikte çalışabileceğiniz iki veri türü kategorisi vardır. İlk kategori, ilkel veri türleridir. Şu anda var [seven primitive types]. Bu ilkel veri türleri sayı, dize, boolean, null, tanımsız, BigInt ve Symbol’dür. BigInt ve Symbol daha yeni veri türleridir.

Sembol, ES6 spesifikasyonunda tanıtıldı. BigInt daha sonra ES2020 spesifikasyonunda tanıtıldı. Bir şey bu ilkel veri türlerinden biri değilse, teknik olarak bir nesnedir. Bu, gerçek nesneler kadar diziler ve hatta işlevler için de geçerlidir. JavaScript görünümüne göre, bunların tümü nesnelerdir.

İlkel veri türleri ve nesneler arasındaki bu ayrım önemlidir çünkü JavaScript her birini farklı şekilde işler.

// İlkel veri türleri: const numberVal = 5 const strVal = “Merhaba!” const boolVal = true const nullVal = boş sabit undefinedVal = undefined const bigIntVal = 9007123254550972n const symbolVal = Symbol (‘label’) // Nesneler: const myObjLiteral = {name: ‘Toby’} const myArray = [9, ‘book’, true, null]

function myFunction (num1, num2) {return num1 / num2}

İlkel veri türleri ve ilkel değerler

İlk kategori olan ilkel veri türleriyle başlayalım. Bu ilkel veri türlerini içeren değerlere statik veri denir. Statik veri olarak JavaScript, bunları yığın üzerinde depolar. Bu ilkel değerlerle ilgili önemli bir şey, boyutlarının sabit olmasıdır. JavaScript, bu veri türlerinin ne kadar belleğe ihtiyacı olduğunu bilir.

Diyelim ki bazı değişkenlere değer olarak ilkel bir veri türü atadınız. Şu andan itibaren bu değişken bu değeri içerecektir. Bu değişkenle manipüle ederseniz, doğrudan ona atadığınız değerle manipüle edersiniz. Bunu ve sonuçlarını test etmenin basit bir yolu, değişkeni başka bir değişkene atamaktır.

Bir değişkeni diğerine atadığınızda ve ilkinin değeri ilkel veri türü olduğunda, JavaScript bu değeri kopyalayacaktır. Bunu yaptığınızda değerleri “değere göre” kopyalıyorsunuz. Öyleyse, şimdi, ilk değişkenin değerini değiştirirseniz, ikincisi aynı kalacaktır. Bunun nedeni, bir değişkeni diğerinden oluşturmuş olsanız bile, her ikisinin de kendi ayrı değerleri olmasıdır.

Yani, bir değişkenin değerini değiştirirseniz, ikincisi değişmeyecektir. İkinci değişken, ayrı bir varlıktır. Yığına geri dönelim. İlk değişkeni atadığınızda JavaScript, değerini yığında depolar. Değişkeni başka bir değişkene atadığınızda, değişkenin değeri de yığına eklenecektir.

Şu anda, yığın şimdi her değişken için bir tane olmak üzere iki değer içerecektir. Her iki değerin de aynı olması önemli değil. İkinci değişkeni ilkinden yaratmış olmanız da önemli değildir. JavaScript için bunlar iki ayrı varlıktır. Bu iki değişkenin birbiriyle hiçbir ilişkisi yoktur.

Bu aynı zamanda, bu değişkenlerin her biriyle istediğiniz gibi güvenle çalışabilmenizin nedenidir. Bir değişkeni diğerini değiştirmeden değiştirebilmenizin nedeni budur.

// Bir değişken oluşturun ve ona ilkel bir değer atayın: let x = ‘Merhaba’ // “x” i başka bir değişkene atayın: let y = x // “x” değerini değiştirin: // NOT: bu “y” yi değiştirmeyin. x = ‘Bye’ // “x” değerini günlüğe kaydedin: console.log (x) // Çıktı: // ‘Bye’ // “x” değerini günlüğe kaydedin: console.log (y) // Çıktı: // ‘Merhaba’ // “y” yi başka bir değişkene atayın: let z = y // “z” yi başka bir değişkene atayın: let w = z // “y” değerini değiştirin: // NOT: bu olmaz “z” ve “w” yi değiştirin. y = ‘Eloquent’ // “x” değerini günlüğe kaydedin: console.log (z) // Çıktı: // ‘Merhaba’ // “x” değerini günlüğe kaydedin: console.log (w) // Çıktı: // ‘Merhaba’

Nesneler ve referanslar

Nesneler farklı bir hikaye. Değişken atadığınızda, bir nesne JavaScript onu farklı şekilde ele alır. Değer, nesne yığına eklenmeyecektir. Bunun yerine, bellek yığınına eklenecektir. Çok önemli bir fark daha var. Bu değişken, değeri, nesneyi değil, o nesneye bir referansı içerecektir.

Bu referansı bir bağlantı veya zincir olarak düşünün. Belirli bir değişkeni belirli bir nesneye bağlayan bir bağlantıdır. Bunun önemli bir sonucu var. Bu değişkeni değiştirirseniz, referansla ve bu referans aracılığıyla nesnenin kendisiyle çalışırsınız. Ya o değişkeni başka bir değişkene atayarak bu nesneyi kopyalarsanız?

Bunun, ilkel değer durumunda olduğu gibi, başka bir nesneyi, birincinin kopyasını yaratacağını düşünebilirsiniz. Bu olacak şey değil. Gerçekte olacak şey, JavaScript’in yeni referans oluşturmasıdır. JavaScript yalnızca orijinal nesneye yeni referans veya bağlantı oluşturacaktır.

Bellek yığınında hala yalnızca bir nesne olacak, orijinal. Buna “referansla” kopyalama denir ve bir nesneyi her kopyaladığınızda gerçekleşir. Bu şekilde referans olarak kopyalamak, nesnelerin sığ kopyalarının oluşturulmasıyla sonuçlanır. Bu tür kopyalamanın da ciddi bir sonucu vardır.

Bu değişkenlerden herhangi birini kullanırsanız, aynı nesneyi de kullanırsınız. Yani, bir değişkeni değiştirerek nesneyi değiştirirseniz, diğer değişkeni de değiştirmiş olursunuz. Her ikisi de farklı değişkenlerdir, ancak her ikisi de aynı nesneye başvurur veya ona bağlanır.

// Bir değişken oluşturun ve ona basit bir nesne atayın // a = {ad: ‘Stan’} // “a” yı başka bir değişkene atayın: let b = a // “a” değerini değiştirin // Nesneye yeni “yaş” özelliği ekleme: a.age = 44 // “a” değerini günlüğe kaydet: // console.log (a) // Çıktı: // {ad: ‘Stan’, yaş: 44} // “b” değerini günlüğe kaydedin: // console.log (b) // Çıktı: // {name: ‘Stan’, age: 44} // “b” yi başka bir değişkene atayın: let c = b / / “C” yi başka bir değişkene atayın: let d = c // “d” nin değerini değiştirin // nesneye başka bir özellik // “favoriteAnimal” ekleyerek: d.favoriteAnimal = “fil” // değerini günlüğe kaydedin “a”: console.log (a) // Çıktı: // {// ad: ‘Stan’, // yaş: 44, // favoriAnimal: ‘fil’ //} // “b” değerini günlüğe kaydedin : console.log (b) // Çıktı: // {// ad: ‘Stan’, // yaş: 44, // favoriAnimal: ‘fil’ //} // “c”: console değerini günlüğe kaydedin. log (c) // Çıktı: // {// ad: ‘Stan’, // yaş: 44, // favoriAnimal: ‘fil’ //} // “d” değerini günlüğe kaydet: console.log (c ) // Çıktı: // {// ad: ‘Stan’, // yaş: 44, // favoriAnimal: ‘fil’ //}

Not: Referansla kopyalamanın nasıl çalıştığını anlamanın bir yolu, anahtarlar ve evler hakkında düşünmektir. Anahtarınızı kopyaladığınızda, yeni bir ev de yaratmıyorsunuz. Hala sadece bir ev var, ancak şimdi o evin kilidini açabilecek iki anahtar var. Değişkenler o anahtarlardır, nesne o evdir.

İlkel veri türleri, nesneler, değerler ve referansların hızlı özeti

Artık ilkel değerler ve referanslar arasındaki farkı biliyorsunuz. İlkel veri türleri atadığınızda ve sonra bunları kopyaladığınızda, değerlere göre kopyalıyorsunuz. Bu kopyaların (değişkenlerin) her biri, diğeriyle hiçbir ilişkisi olmayan ayrı bir varlıktır. Birini diğerini değiştirmeden değiştirebilirsiniz.

Bir nesneyi atayıp sonra kopyaladığınızda, referansa göre kopyalıyorsunuz. Her kopya için yeni referanslar oluşturuyorsunuz. Sonuç olarak, birden çok referans (değişken) vardır. Ancak yine de tek bir nesne var. Bu değişkenlerden birini değiştirirseniz, orijinal nesneyi değiştirmiş olursunuz. Bu, tüm referansları (değişkenleri) etkileyecektir.

İlkel değerler, referanslar ve karşılaştırma

Değer ve referans arasındaki farkı bilmek, bir şeyleri karşılaştırmak istediğinizde önemlidir. Karşılaştırmanın hem ilkel değerler hem de nesnelerle nasıl çalıştığına bir göz atalım.

İlkel değerleri karşılaştırma

İki ilkel değeri karşılaştırmak genellikle basittir. Tek sorun, eşit ve katı eşit ve hangisinin kullanılacağını bilmektir (genellikle kesinlikle eşit olacaktır). İlkel değerlerin tam eşitlikle karşılaştırılması, değer ve türü kontrol edecektir. İkisi de aynıysa, gerçek olacaksın. Değilse, yanlış olacaksın.

// Bir ilkel değer: // Bir değişken oluşturun ve ona ilkel değer atayın: const str1 = ‘JavaScript’ // Başka bir değişken oluşturun ve ona “str1” atayın: const str2 = str1 // “str1” ve “str2” yi karşılaştırın: console.log (str1 === str2) // Çıktı: // true // İki özdeş ilkel değer: // İki değişken oluşturun ve bunları // aynı ilkel değerleri atayın: const num1 = 15 const num2 = 15 // Karşılaştırın “num1” ve “num2”: console.log (num1 === num2) // Çıktı: // true

Nesneleri ve referansları karşılaştırma

Referanslar farklı çalışır. İki farklı nesneyi karşılaştırırsanız ve içerik aynıysa, karşılaştırma yine de yanlışla sonuçlanacaktır. Karşılaştırma, yalnızca aynı nesneye yapılan referansları karşılaştırırsanız doğru sonucunu verecektir.

// Bir nesne: // Bir değişken oluşturun ve ona bir nesne atayın: const a = {ad: ‘Jack’} // “a” yı başka bir değişkene atayın: const b = a // “a” ve “b” yi karşılaştırın : console.log (a === b) // Çıktı: // true // İki özdeş nesne: // Bir değişken oluşturun ve ona bir nesne atayın: const a = {name: ‘George’} // Başka bir değişken oluşturun ve ona aynı nesneyi atayın: const b = {name: ‘George’} // “a” ve “b” yi karşılaştırın: console.log (a === b) // Çıktı: // false

Dizilerin ve fonksiyonların da teknik olarak nesneler olduğunu unutmayın. Bu, aynı dizilere sahip değişkenleri karşılaştırırsanız sonucun her zaman yanlış olacağı anlamına gelir. Bu değişkenler ancak ikisi de aynı diziye başvurursa aynı olacaktır.

// Bir dizi: // Bir değişken oluşturun ve ona bir dizi atayın: const x = [1, 2, 3, 4]

// Başka bir değişken oluşturun ve ona “x” atayın: const y = x // “x” ve “y” yi karşılaştırın: console.log (x === y) // Çıktı: // true // İki özdeş dizi: // Bir değişken oluşturun ve ona bir dizi atayın: const x = [1, 2, 3, 4]

// Başka bir değişken oluşturun ve ona aynı diziyi atayın: const y = [1, 2, 3, 4]

// “x” ve “y” yi karşılaştırın: console.log (x === y) // Çıktı: // false

Fonksiyonlar ve değere ve referansa göre geçiş

Değer ve referans arasındaki farkı bilmek, işlevlerle çalışırken de yararlıdır. Bir değişkende depolanan bazı ilkel değerleri bağımsız değişken olarak bir işleve ilettiğinizde, onu “değere göre” geçirmiş olursunuz. Temelde bu değerin kendisini bir işleve kopyalıyorsunuz. Bunun sonucu, “değere göre” kopyaladığınızdakiyle aynıdır.

İşleve aktarılan değeri değiştirmeye çalışırsanız, değişkenin kendisi üzerinde hiçbir etkisi olmayacaktır. Bu değişkenin değeri aynı kalacaktır. Fonksiyon tarafından yarattığınız değişikliğin üzerinde hiçbir etkisi olmayacaktır. Değişkenin kendisine erişip doğrudan değiştirmediğiniz sürece, ama bu farklı bir senaryodur.

// Bir değişken oluşturun ve ona ilkel bir değer atayın: let personName = “Andrei” // Argüman olarak aldığı değeri // değiştirmeye çalışacak bir işlev oluşturun: function changeNameFunc (name) {name = “Viktor”} // “changeNameFunc” işlevini çağırın: changeNameFunc (personName) // “name” değişkeninin değerini günlüğe kaydedin: console.log (personName) // Çıktı: // ‘Andrei’ // <= İsim aynı.

Bunu bir nesneyle yapmaya çalışırsanız, sonuç farklı olacaktır. Bir nesneyi geçtiğinizde, “referans olarak” iletilir. Bu durumda JavaScript, işlevin kullanabilmesi için nesneyi kopyalamaz. Size sadece orijinal nesneye referans verir. Nesneyi değiştirmeye çalışırsanız, aslında orijinal nesneyi değiştirirsiniz.

// Bir değişken oluşturun ve ona bir nesne atayın: let person = {name: ‘Andrei’} // Argüman olarak aldığı değeri // değiştirmeye çalışacak bir işlev oluşturun: function changeNameFunc (person) {person.name = “Viktor”} // “changeNameFunc” işlevini çağırın: changeNameFunc (kişi) // “name” değişkeninin değerini günlüğe kaydedin: console.log (kişi) // Çıktı: // {ad: ‘Viktor’} // <= İsim farklı.

Sonuç: JavaScript’teki ilkel değerler, nesneler ve referanslar basitleştirildi

İlkel veri türleri, değerler, nesneler ve referanslar anlaşılması zor olabilen konulardır. Bu özellikle yeni başlayanlar ve genç JavaScript geliştiricileri için geçerlidir. Umarım bu eğitim, nasıl çalıştıklarını, aralarındaki farkları ve nasıl çalıştıklarını anlamanıza yardımcı olur.

Bu makaleyi beğendiyseniz, lütfen abone olun, böylece gelecekteki hiçbir gönderiyi kaçırmazsınız.

Beni ve bu blogu desteklemek isterseniz, bir patron olabilirsiniz veya bana bir kahve ısmarlayabilirsiniz 🙂

Patreon Kullanıcı Olun PayPal simgesi Paypal ile Bağış Yapın

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz