Tüm blog yazıları

JavaScript’te Dizilerin Karşılaştırılması

JavaScript’te program yazarken bazen iki verinin “aynı” olup olmadığını kontrol etmemiz gerekir. Bu, kullanıcıdan gelen veriyle elimizdeki değeri karşılaştırmak, iki listeyi kontrol etmek veya aynı şeyi temsil edip etmediklerini sorgulamak için yapılır. Ancak, bu tür karşılaştırmalarda özellik

eminbasbayan3 dk okuma
JavaScript’te Dizilerin Karşılaştırılması

JavaScript’te program yazarken bazen iki verinin “aynı” olup olmadığını kontrol etmemiz gerekir. Bu, kullanıcıdan gelen veriyle elimizdeki değeri karşılaştırmak, iki listeyi kontrol etmek veya aynı şeyi temsil edip etmediklerini sorgulamak için yapılır. Ancak, bu tür karşılaştırmalarda özellikle diziler (arrays) ile çalışırken dikkatli olunmalıdır. Çünkü diziler, JavaScript’te beklediğiniz gibi karşılaştırılmaz.

Bu yazıda, sadece dizilerin karşılaştırılma mantığını ve bellekte nasıl saklandıklarını anlamaya odaklanacağız. Bu konuyu sade örneklerle açıklayacağız.

1. Basit Değerler Karşılaştırıldığında

JavaScript’te sayılar ve metinler gibi temel (primitive) veri türlerini karşılaştırmak oldukça nettir. Örneğin:

metin
"kitap" === "kitap"  // true
5 === 5              // true

Burada === operatörü kullanılıyor. Bu operatör, hem değerin hem de veri türünün aynı olup olmadığını kontrol eder. İki taraf da aynıysa, sonuç true döner.

2. Dizilerde İşler Değişir

Şimdi aynı mantıkla iki dizi karşılaştıralım:

metin
["güneş", "ay"] === ["güneş", "ay"] // false

İlk bakışta bu iki dizi tamamen aynı görünüyor. İçlerinde aynı kelimeler var, aynı sırada dizilmiş. Ama JavaScript bu karşılaştırmayı false olarak değerlendirir.

Neden? Çünkü JavaScript, dizilerin içeriğini değil, onların bellekteki yerlerini karşılaştırır.

3. Bellek ve Referans Mantığı

Basit veriler bellekte doğrudan saklanır. Örneğin:

metin
let x = 10;

Burada x, doğrudan değeri yani 10’u bellekte tutar. Ama diziler gibi karmaşık yapılar doğrudan saklanmaz. Bunun yerine, JavaScript bellekte dizinin bulunduğu yeri, yani referansını saklar.

Örneğin:

metin
let liste = [1, 2, 3];

Burada liste, dizinin içeriğini değil, o dizinin bellekteki adresini saklar. Yani, bir nevi "bu dizi şurada duruyor" demiş olur.

4. Aynı Referansı Paylaşan Değişkenler

Bu durumu daha iyi anlamak için bir örnek:

metin
let meyveler = ["elma", "armut"];
let sepet = meyveler;

Burada sepet, meyveler değişkeninin tuttuğu diziyi yeni baştan oluşturmaz. Bunun yerine, aynı bellekteki diziye başka bir isimle işaret eder.

Eğer şimdi meyveler.push("çilek") yaparsak, sepet de bu değişiklikten etkilenir çünkü ikisi de aynı diziyi gösteriyor.

metin
console.log(sepet); // ["elma", "armut", "çilek"]

Aynı şekilde:

metin
sepet.pop(); // "çilek" çıkar
console.log(meyveler); // ["elma", "armut"]

Yani, ikisinden birinde yapılan değişiklik, diğerine de yansır. Çünkü ikisi de aynı referansa sahiptir.

5. Gerçekten Aynılar mı? JavaScript Nasıl Anlar?

Bu tür durumlarda === operatörü çalışır:

metin
meyveler === sepet // true

Çünkü JavaScript şunu sorar:

Bu iki değişken aynı bellekteki adresi mi işaret ediyor?

Eğer cevap evetse, === sonucu true olur. Ama içeriği birebir aynı olan ama farklı yerlerde tutulan diziler varsa:

metin
let a = [7, 8, 9];
let b = [7, 8, 9];

console.log(a === b); // false

Bu iki dizi görünüşte aynı ama bellekte iki ayrı yerde bulunuyor. Bu yüzden JavaScript onları aynı kabul etmez.

6. İçeriği Karşılaştırmak Kolay Değil

Eğer iki dizinin içeriği aynı mı diye kontrol etmek istiyorsanız, JavaScript bunu sizin yerinize otomatik olarak yapmaz. Siz manuel olarak her elemanı karşılaştırmalı veya farklı yöntemler (örneğin JSON.stringify) kullanmalısınız.

Ama bu yazıda yalnızca referans temelli karşılaştırmalar ele alındığı için, bu konuya daha fazla girmiyoruz.

Sonuç

JavaScript’te dizilerin karşılaştırılması, göründüğü kadar basit değildir. İki dizi aynı içeriğe sahip olsa bile, farklı referanslara sahipse === veya == ile yapılan karşılaştırma false döner. Sadece aynı diziyi gösteren iki değişkenin karşılaştırması true olur.

Bu nedenle, JavaScript’te dizilerle çalışırken şunlara dikkat etmek gerekir:

  • === ve == operatörleri, dizilerin içeriğini değil, bellekteki adresini karşılaştırır.
  • Aynı içeriğe sahip iki ayrı dizi, JavaScript’e göre “aynı” değildir.
  • Bir diziyi başka bir değişkene atarsanız, aslında sadece aynı yeri işaret etmiş olursunuz.
  • Değişkenlerden birinde yapılan değişiklik, diğerini de etkiler.

Bu farkları erken öğrenmek, JavaScript’te hata yapmamanız açısından oldukça önemlidir.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele