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?” ve “Javascript’teki veri tipleri arasındaki ne gibi farklılıklar vardır”, “typeof operatörü nedir?” sorularına cevap vereceğiz.
JavaScript’te Primitive Veri Tipleri
JavaScript’te yer alan ilkel veri tipleri aşağıda listelendiği gibidir:
- ⭐ Number ➡️ Sayısal değerleri temsil eder. Örnek: 42, 3.14, -100 gibi.
- ⭐ Bigint ➡️ Çok büyük tam sayıları temsil etmek için kullanılır.
- ⭐ String ➡️ Metinsel değerleri temsil eder. Örnek: “Merhaba”, “Dünya”, “123” gibi.
- ⭐ Boolean ➡️ Mantıksal değerleri temsil eder ve iki değere sahiptir: true (doğru) ve false (yanlış).
- ⭐ null* ➡️ Belirli bir değerin yokluğunu ifade eder.
- ⭐ undefined ➡️ Bir değişken veya nesnenin değeri atanmadığında veya henüz tanımlanmadığında alınan varsayılan değerdir.
- ⭐ Symbol
İlkel veri tiplerinde değere erişmek istediğimizde o adreste depolanan gerçek değere erişiriz. Bu ise hafızada tutulan adresteki değerini değiştirmez. Bunun yerine ilgili değişkeninin yeni değerini tutan yeni bir adres oluşturulur.
JavaScript’te Reference Veri Tipleri
JavaScript’teki referans veri tipleri nesneleri temsil etmektedir.
- ⭐ Object (array, function, …)
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. Aşağıdaki örneği inceleyelim:
1 2 3 4 5 6 7 |
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.
JavaScript’te typeof Operatörü
JavaScript’te bir değerin hangi veri tipinde olduğunu belirlemek için “typeof” operatörü kullanabiliriz. Örneğin:
1 2 3 4 5 6 7 8 9 |
//JavaScript'te typeof Operatörü typeof 42; // "number" typeof "abc"; // "string" typeof true; // "boolean" typeof undefined; // "undefined" typeof null; // "object" -- oops, bug! typeof { "a": 1 }; // "object" typeof [1,2,3]; // "object" typeof function hello(){}; // "function" |
❗ Yukarıdaki kodları incelediğinizde null için object denildiği görülmektedir. JavaScipt’te “typeof null” sonucunun “object” döndürmesi bir hata olarak kabul edilir. Ancak bu bir JavaScript dil özelliği bug’ıdır. Zira JavaScript’in ilk sürümlerinden beri bu hata var olduğu için geriye doğru uyumluluğu koruması adına bu şekilde kalmasına müsaade edilmiştir.