JavaScript Veri Tipleri, Stack-Heap Kavramları

Ruken Erpolat
4 min readJan 16, 2023

--

Merhaba, ilk yazımda JavaScript temellerinden ve değişkenlerden bahsetmeye çalışmıştım. Bu yazımda ise veri tipleri, stack-heap bellek kavramlarını yazmaya çalışacağım.

JavaScript, dinamik olarak yazılan bir dildir. Bu, bir değişkenin farklı türlerde bir değer tutabildiği anlamına gelir. Bilgisayar, verinin saklanacağı bellek alanını, değişkenin türüne göre ayırır ve uygun işlemi gerçekleştirebilir.

JavaScript veri tiplerini 2'ye ayırırız; bunlar, İlkel (Primitive) Veri Tipleri ve İlkel Olmayan (Reference) Veri Tipleridir.

Değişkenin depoladığı değerin geçerli türünü öğrenmek için typeof operatörünü kullanabiliriz:

let x = 120; // burada x'in veri tipi number 
console.log(typeof(x)); // Output: "number"

x = false; // bu atamada; boolean
console.log(typeof(x)); // Output: "boolean"

x = "merhaba"; // burada ise string veri tipindedir
console.log(typeof(x)); // Output: "string"

1. İlkel (Primitive) Veri Tipleri

a. Number Type

let s = 123;
s = 12.345;

number, hem integer hem de floating point sayıları için kullanılır. Sayılar *, /, + veya - işlemlerine girebilirler. Normal sayıların haricinde “özel sayısal değerler” de sayı olarak tanımlanabilir.

Bunlar : Infinity, -Infinity ve NaN gibi değerlerdir.

  • Infinity matematiksel Sonsuzluğu ∞ ifade eder. Diğer tüm sayılardan büyük olan özel bir sayıdır.
  • 0’a bölünmede sonuç sonsuzu verir:
alert( 1 / 0 ); // Infinity 

NaN hesaplamalarda bir hata olduğunu gösterir. Hatalı veya tanımsız matematiksel hesapları gösterir. NaN üzerinde yapılacak herhangi bir işlem yeniden NaN çıktısı verecektir:

alert( "Sayı Değil ( Not a Number) " / 2 ); 
// NaN, böyle bir bölme işlemi yapılamaz.

alert( "not a number" / 2 + 5 ); // NaN

Öyleyse matematiksel işlemlerin herhangi bir yerinde NaN alınıyorsa bu hesabın tamamını etkiler.

b. String Type

String veri tipi içerisinde metinsel ifadeleri saklar. String veriler değişkenlere atanırken (“) tırnak işareti ya da (‘) kesme işareti kullanılır.

let str = "Merhaba";
let str2 = 'Tek tırnak da çalışır';
let phrase = `değer veya değişkenler gömülebilir ${str}`;

JavaScript’te 3 çeşit tırnak içine alma yöntemi vardır.

  1. Çift tırnak: "Hello".
  2. Tek tırnak: 'Hello'.
  3. Ters tırnak: `Hello`.

Çift tırnak ile tek tırnak “basit” tırnaklardır. Aralarında bir farklılık yoktur.

Ters tırnak ise “genişletilmiş fonksiyonlu” tırnaktır. Bunu kullanarak karakter dizisi içerisine ${...} gibi başka bir dizi yerleştirebiliriz.

let isim = "Ruken";

// değişken gömme:
alert( `Hello, ${isim}!` ); // Hello Ruken!

// ifade gömme:
alert( `sonuç : ${20 + 5}` ); //sonuç : 25

c. Boolean (Doğru/Yanlış) Type

Boolean tipi true ve false olmak üzere sadece iki değer tutabilir. Genelde bu tip veriler doğru / yanlış sorularını tutmak için kullanılır.

let isimKontrolu = true; // İsim kontrolü yapıldı.
let yasKontrolu = false; // Yaş kontrolü yapılmadı.


//Karşılaştırma sonuçları da boolean verebilir:

let buyuk = 4 > 1;

alert( buyuk ); // true (cevap görüldüğü gibi "doğru" çıkacaktır.)

d.Null Type

“null” değeri, yukarıda tanımlanan hiçbir tipe dahil değildir. Kendi başına null değerini tutar. JavaScript’te null, olmayan objeyi referans göstermez.

let yas = null;
// Yukarıdaki yas boş veya bilinmeyen bir değerdir.

e.Undefined Typee

undefined anlam olarak “herhangi bir değer atanmamış” anlamına gelir. Eğer bir değişken tanımlanmış fakat hiçbir değer atanmamışsa tam olarak bu değeri alır.

let x;

alert(x); // "undefined" çıktısı verir.


// Teknik olarak undefined değerini herhangi bir değişkene atamak mümkündür:

let x = 123;

x = undefined;

alert(x); // "undefined"

Normalde null kullanılarak değişkenin boş veya bilinmeyen olduğu tanımlanır, undefined değişkene bir değer atanmış mı? Sorusunu kontrol eder.

f. Symbol Type

Sembol türü, nesneler için eşsiz (unique) tanımlayıcılar oluşturmak için kullanılır. ECMAScript 6 ile beraber 2015 senesinde son olarak eklenen bir veri türüdür. Özellikleri değiştirilemez (immutable) olan nesnelerdir.

let id = Symbol();
console.log(typeof id) // symbol

g. BigInt Type

BigInt değerleri, sayı ilkeliyle temsil edilemeyecek kadar büyük olan sayısal değerleri temsil eder.

const previouslyMaxSafeInteger = 9007199254740991n

const alsoHuge = BigInt(9007199254740991)
// 9007199254740991n

const hugeString = BigInt("9007199254740991")
// 9007199254740991n

const hugeHex = BigInt("0x1fffffffffffff")
// 9007199254740991n

const hugeOctal = BigInt("0o377777777777777777")
// 9007199254740991n

const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111")
// 9007199254740991n

2.İlkel Olmayan (Reference) Veri Tipleri

Object Veri Tipleri

Nesne, birkaç değişkeni ve değerleri içeren verileri, tek bir değişkende gruplandırmanıza izin veren bir veri türüdür. Bu genellikle bir varlığı temsil etmek veya tanımlamak için kullanılır. Örneğin, bir kişi, bir kullanıcı, bir ürün vb.

Diğer tüm tipler “primitive” yani basit veya ilkel tiplerdir. Bu değişkenler sadece bir şey tutabilirler (karakter dizisi veya sayı). Buna karşılık objeler veri koleksiyonları (collections) veya karmaşık yapılar tutabilirler ve bellekte daha geniş yer kaplarlar.

const user = {
id: 1,
firstName: "Sam",
lastName: "Doe",
age: 20
};
// Bu, bir kullanıcının verilerinin tutulduğu,
// user isimli bir object yapısıdır.

Objelerdeki veriler isimlendirilirken, özellik adları için camelCase kullanmanız önerilir (örneğin, firstName ).

Temel bilgiler ile veri tiplerini bu şekilde tanımlayabiliriz. Bu veri tiplerini JavaScript, bellekte (ram) saklamak zorundadır ve iki tip bellek alanı vardır. Bunlar stack ve heap alanlarıdır.

Stack — Heap Bellek Alanları

Stack, LIFO (Last In, First Out) yapısına göre çalışır. Yani yeni veriler öncelikli olarak en üstte yer alır ve son eklenmiş olan yeni veri kullanılır. Bu yapı, fonksiyon çağrıları veya döngüler gibi yapılar için kullanılır. Stack, bellekte az yer kaplar ve hızlı erişim sağlar ancak bellek miktarı sınırlıdır. Stack, programın çalışması sırasında dinamik olarak oluşan veriler için idealdir, çünkü veriler program bitene kadar varlıklarını korurlar ve son kullanımdan sonra bellekte yeri serbest bırakılır.

Heap ise, bellekte daha büyük alan kaplar ve daha yavaş erişim sağlar. Burada, object, array gibi veri tipleri depolanır. Heap, verilerin rastgele erişimi için de kullanılır.

Sonuç olarak; stack de oluşturulan bir değişkene değer atandığında ve sonradan aynı değer stack’de bulunan farklı bir değişkene atandığında dinamik oluşamayacağı için birbirinde habersiz iki farklı değişken mantığında çalışır. Fakat heap alanında ise bir obje oluşturulduğunda ve daha sonradan aynı değere sahip farklı bir obje oluşturulduğunda heap alanı, zaten böyle bir obje mevcut diyerek bellekteki mevcut objeyi referans eder.

Ara farklar:

  • Stack bellek yerini daha etkili kullanır ve hızlıdır çünkü yalnızca son eklenen veriye erişim mümkündür, Heap bellek yerini daha az etkili kullanır ancak daha esnektir.
  • Stack bellekte daha az yer kaplar, Heap bellekte daha fazla yer kaplar.
  • Stack bellek yer liberasyonu otomatik gerçekleşir, Heap bellek yer liberasyonu program tarafından yapılması gereken işlemdir.

Okuduğunuz için teşekkür ederim…

Kaynakça:

https://javascript.info/types

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

--

--