JavaScript’te Primitive ve Reference Veri Tipleri
JavaScript’te veri tipleri ilkel (primitive) ve referans (reference) olmak üzere ikiye ayrılır. Bu yazımızda, “Javascript’te bulunan Primitive ve Reference tipler nelerdir, Javascript’teki veri tipleri arasındaki ne gibi farklılıklar vardır, typeof operatörü nedir?” gibi sorulara cevap vereceğiz.
JavaScript’te Primitive Veri Tipleri
JavaScript’teki ilkel veri tiplerini kısa bir özetle gösterelim:
- Number: Sayısal değerleri ifade eder. Tam sayılar ve ondalık sayılar dahildir. Örnek:
42
,3.14
,-100
. - BigInt: Çok büyük tam sayıları temsil eder.
Number
tipinin taşıyabileceği maksimum sınırları aşan değerler için kullanılır. Örnek:1234567890123456789012345678901234567890n
. - String: Metinsel değerleri ifade eder. Çift veya tek tırnak içinde yazılır. Örnek:
"Merhaba"
,'Dünya'
,"123"
. - Boolean: Mantıksal değerlerdir. İki seçenekten birini ifade eder:
true
(doğru) veyafalse
(yanlış). - null: Bilinçli olarak atanmış “boş” bir değeri ifade eder. Bir değişkenin “hiçbir şey” içermediğini belirtir.
- undefined: Bir değişkene herhangi bir değer atanmadığında otomatik olarak sahip olduğu değerdir. Aynı zamanda, bir fonksiyon geriye bir şey döndürmezse
undefined
döner. - Symbol: Benzersiz ve değiştirilemez bir değeri temsil eder. Genellikle nesne özelliklerini tanımlamak için kullanılır.
JavaScript’te ilkel veri tipleri üzerinde işlem yaptığınızda, değere doğrudan erişirsiniz ve bu değer üzerinde yapılan değişiklikler orijinal değişkeni etkilemez. Örneğin, bir değişkene başka bir ilkel veri tipi atanırsa, aslında değer kopyalanır ve bu iki değişken birbirinden bağımsız hale gelir. Değeri değiştirdiğinizde, orijinal hafızadaki adres dokunulmadan kalır ve yeni bir değer için yeni bir hafıza alanı oluşturulur. Bu davranış zaten ilkel veri tiplerinin hafıza yönetimindeki temel özelliklerinden biridir. Biliyorsanız hatırlatmak istedim.
JavaScript’te Reference Veri Tipleri
JavaScript’teki referans veri tipleri nesneleri temsil etmektedir. Bakınız:
- Object: JavaScript’teki temel referans tipi olup, anahtar-değer çiftlerini tutar.
- Array: Bir çeşit nesnedir ve sıralı veri koleksiyonlarını tutmak için kullanılır.
- Function: JavaScript’te birinci sınıf nesnelerdir ve aynı zamanda bir tür nesne olarak değerlendirilir.
- Date, RegExp, Map, Set gibi diğer nesne türleri de referans veri tiplerine dahildir.
Fonksiyonların ve dizilerin, nesne olarak değerlendirilmesi şaşırtıcı olabilse de aslında bu iki yapı, “First-class citizen” olarak adlandırılan bir konuma sahiptir. Eğer JavaScript’te bir değerin hangi veri tipinde olduğunu belirlemek istiyorsanız “typeof” operatörünü kullanabilirsiniz.
Referans veri tiplerinde, değişkenler gerçek veriyi değil, bu verilerin bulunduğu hafızadaki adresi (referansı) tutar. İsminin referans olması da işte bundandır. Bu yüzden, bir referans tipi başka bir değişkene atandığında, her iki değişken de aynı hafıza adresine işaret eder ve biri üzerinde yapılan değişiklik diğerini de etkiler. Bu davranış, ilkel veri tiplerinden en temel farkını oluşturur. Aşağıdaki örneği inceleyelim:
var x = [1, 2, 3];
var y = x;
console.log(x, y);
x.push(4);
console.log(x, y);

Yukarıdaki örnekte de görüleceği üzere y değeri başlangıçta x’in sahip olduğu değere eşitlenmiştir. Ancak bu eşitlenme ile a’nın bellekteki yerini kopyaladığı için x’in değeri sonradan değiştiğinde y’nin değeri de değişmiştir. Peki neden böyle oluyor?
Cevap olarak bellek yönetimi (Memory Management) diyebiliriz. Javascript’te stack ve heap olmak üzere iki tip bellek alanı bulunmaktadır. Bu aynı zamanda JavaScript’te primitive ve reference veri tipleri arasındaki en temel farkı oluşturmaktadır.

Referans veri tipinde ise bir değere erişilmek istendiğinde doğrudan ilgili değerin işaret ettiği referansa erişilir ve Stack’te yeni bir hafıza oluşturulur ve Heap’teki hafızanın adresini referans (zaten adı da bu özelliğinden gelmektedir) olarak gösterir. Objenin sahip olduğu değeri değil, hafızanın adresini değer olarak gösterir ve objeye işaret eder.
JavaScript’te ilkel veri tipleri (primitive data types) olarak adlandırılan Number, String, Boolean, Null, Undefined ve Symbol veri tipleri, stack’te saklanır ve sabit bir boyuta sahiptirler. Bu ilkel veri tipleri, doğrudan değişkenlere atanabilirler ve değer kopyalanarak aktarılabilirler.
Referans veri tipleri (reference data types) ise boyutu ve yapısı belli olmayan veri tipleridir ve heap’te saklanırlar. Referans veri tipleri arasında, Object, Array ve Function gibi nesne türleri yer alır. Bu veri tipleri, bir bellek adresi (memory address) ile işaretlenirler ve bu bellek adresleri, değişkenlere atanır. Değişkenler, bu bellek adreslerine referans (reference) ederler ve bu referanslar, kopyalanarak aktarılabilirler.
İki veri tipi arasındaki temel fark, sahip oldukları bellek yönetimiyle ilgilidir. İlkel veri tipleri, sabit boyutlu olduklarından, stack’te saklanırlar ve bellek yönetimi daha basittir. Referans veri tipleri ise, dinamik boyutlu olduklarından, heap’te saklanırlar ve daha karmaşık bir bellek yönetimi gerektirirler.