JavaScript’te Veri Tipleri
Giriş
Veri tipleri, programlama dillerinde belirli bir veri türünü sınıflandırmak için kullanılır.
Örneğin bir sayı ile bir karakter dizisi (string) farklı veri tipleridir ve JavaScript tarafından farklı şekilde işlenirler.
Kullandığınız veri tipi önemlidir çünkü ona hangi değerleri atayabileceğinizi ve onunla neler yapabileceğinizi belirler.
Yani, JavaScript’te değişkenlerle işlem yapabilmek için her bir değişkenin veri tipini anlamak çok önemlidir.
Bu rehberde JavaScript’te veri tiplerinin nasıl çalıştığını ve dilin kendi içinde bulunan önemli veri tiplerini inceleyeceğiz.
Bu, veri tiplerinin kapsamlı bir incelemesi olmayacak; ama JavaScript’te karşınıza çıkacak seçeneklere aşina olmanıza yardımcı olacak.
Dinamik Tipler
JavaScript’te veri tipleri dinamiktir.
Yani tip kontrolü derleme (compile time) aşamasında değil, çalışma (runtime) sırasında yapılır.
Python’un veri tipleri de aynı şekilde dinamiktir.
Dinamik tipli dillerde, aynı isimdeki bir değişken farklı veri tiplerini tutmak için kullanılabilir.
Örneğin, let anahtar kelimesiyle tanımlanan t değişkeni (not: let, değişkeni belirli bir scope ile sınırlar) farklı veri tipleri tutmak için atanabilir.
Hatta sadece tanımlanıp, değer verilmeden de bırakılabilir.
let t = 16; // t bir number (sayı)
let t = "Tarık"; // t bir string (metin)
let t = true; // t bir Boolean (mantıksal değer)
let t; // t undefined (tanımlı ama değeri yok)
Yukarıdaki örnekte görüldüğü gibi, t değişkeni JavaScript’te mevcut olan herhangi bir veri tipine ayarlanabilir.
Kullanılmadan önce veri tipinin açıkça belirtilmesine gerek yoktur.
Sayılar (Numbers)
JavaScript’te yalnızca bir adet sayı tipi vardır.
Tamsayılar (integer) ile ondalıklı sayılar (floating-point) için ayrı bir tür bulunmaz.
Bu nedenle sayılar JavaScript’te ondalık basamaklı veya ondalık basamaksız şekilde yazılabilir:
let num1 = 53;
let num2 = 53.00;
Her iki durumda da veri tipi number’dır ve sayının ondalık basamak içerip içermemesi fark etmez.
JavaScript’te çok büyük veya çok küçük sayıları kısaltmak için bilimsel gösterim (exponential notation) kullanılabilir.
Aşağıdaki örneklerde olduğu gibi:
let num3 = 647e8; // 64700000000
let num4 = 647e-8; // 0.00000647
JavaScript’te sayılar 15 basamağa kadar kesin (doğru) kabul edilir.
16. basamaktan sonra sayılar yuvarlanmaya başlar:
let num5 = 999999999999999; // 999999999999999 olarak kalır
let num6 = 9999999999999999; // 10000000000000000 olarak yuvarlanır
Sayıları temsil etmenin yanı sıra, JavaScript’in number türünde üç özel sembolik değer de bulunur:
- Infinity — Pozitif sonsuzluğu temsil eden sayısal değer
- -Infinity — Negatif sonsuzluğu temsil eden sayısal değer
- NaN — “Not a Number” ifadesinin kısaltması; yani sayı olmayan bir değeri temsil eder
JavaScript’te kullanılabilecek en büyük sayı aralığının dışına çıkan işlemlerde sonuç Infinity veya -Infinity olarak döner.
Ayrıca tanımsız işlemlerden (örneğin sıfıra bölme) de bu değerler ortaya çıkabilir.
let num7 = 5 / 0; // Infinity döner
let num8 = -5 / 0; // -Infinity döner
Teknik olarak, bir sayı 1.797693134862315E+308 değerini (JavaScript’teki üst sınır) aştığında sonuç Infinity olur.
Benzer şekilde, sayı -1.797693134862316E+308 değerinin altına düştüğünde sonuç -Infinity olur.
Ayrıca Infinity değeri döngülerde de kullanılabilir:
while (num9 != Infinity) {
// Buradaki kod num9 = Infinity olana kadar çalışır
}
Geçerli (yasal) bir sayı olmayan değerlerde NaN görüntülenir.
Bir sayı ile sayısal olmayan bir değer üzerinde matematiksel işlem yapmaya çalışırsanız sonuç NaN döner.
Aşağıdaki örnekte olduğu gibi:
let x = 20 / "Köpekbalığı"; // x'in değeri NaN olur
20 sayısı "Köpekbalığı" stringine bölünemez, çünkü "Köpekbalığı" sayısal bir değer olarak değerlendirilemez.
Bu yüzden x değişkeninin dönen değeri NaN olur.
Ancak, bir string sayısal bir değer olarak değerlendirilebiliyorsa, JavaScript bu matematiksel işlemi gerçekleştirebilir:
let y = 20 / "5"; // y'nin değeri 4 olur
Yukarıdaki örnekte "5" stringi JavaScript’te sayısal bir değer olarak değerlendirilebildiği için, / bölme operatörüyle normal bir sayıymış gibi işlenir.
Ancak, bir değişkene NaN değeri atanırsa ve bu değişken bir işlemde kullanılırsa, diğer operand geçerli bir sayı olsa bile sonuç yine NaN olur:
let a = NaN;
let b = 37;
let c = a + b; // c'nin değeri NaN olur
JavaScript’te yalnızca bir tane number veri tipi vardır.
Sayılarla çalışırken girdiğiniz herhangi bir sayı, otomatik olarak number tipinde değerlendirilir.
Statik tipli dillerde olduğu gibi veri tipini ayrıca belirtmenize gerek yoktur çünkü JavaScript dinamik tipli bir dildir.
String’ler (Metinler)
String, bir veya daha fazla karakterin (harf, rakam, sembol) sıralı biçimidir.
Metinsel verileri temsil ettikleri için oldukça kullanışlıdırlar.
JavaScript’te string’ler tek tırnak (') veya çift tırnak (") içerisinde tanımlanır.
Yani bir string oluşturmak için karakter dizisini tırnak içine almanız gerekir:
let singleQuotes = 'Bu, tek tırnak içinde bir stringdir.';
let doubleQuotes = 'Bu, çift tırnak içinde bir stringdir.';
Tek tırnak veya çift tırnak kullanmayı seçebilirsiniz, ancak hangisini seçerseniz seçin program boyunca tutarlı olmalısınız.
“Hello, World!” programı, bilgisayar programlamada bir string’in nasıl kullanılabileceğini gösteren klasik bir örnektir. Fakat biz bunu "Rabisu Docs'a Hoşgeldiniz.." göre uyarlayacağız.
Aşağıdaki alert() içinde yer alan Rabisu Docs'a Hoşgeldiniz.. ifadesini oluşturan karakterler bir string’tir.
<!DOCTYPE HTML>
<html>
<head>
<script>
function rabisuFunction() {
alert("Rabisu Docs'a Hoşgeldiniz..");
}
</script>
</head>
<body>
<p><button onclick="rabisuFunction()">Bana Tıkla</button></p>
</body>
</html>
Kodu çalıştırıp Bana Tıkla butonuna bastığımızda, karşımıza şu çıktıyı veren bir pop-up çıkar:
Output
Rabisu Docs'a Hoşgeldiniz..
Diğer veri tiplerinde olduğu gibi, string’leri de değişkenlerde saklayabiliriz:
let hw = "Rabisu Docs'a Hoşgeldiniz..";
Ve değişkeni çağırarak, string’i alert() içinde gösterebiliriz:
...
<script>
let hw = "Rabisu Docs'a Hoşgeldiniz..";
function rabisuFunction() {
alert(hw);
}
</script>
...
Output
Rabisu Docs'a Hoşgeldiniz..
Programlarımızda string’ler üzerinde pek çok işlem yapabiliriz.
Bu işlemler sayesinde string’leri manipüle ederek istediğimiz sonuçları elde edebiliriz.
String’ler önemlidir çünkü kullanıcıya bilgi aktarmak için kullanılırlar,
aynı zamanda kullanıcının da programa bilgi göndermesini sağlarlar.
Boolean
Boolean veri tipi yalnızca iki değerden birini alabilir: true veya false.
Boolean’lar, matematikteki mantık dallarına karşılık gelen doğruluk değerlerini temsil eder.
Bilgisayar bilimlerinde algoritmaların çalışmasını yönlendirmek için kullanılırlar.
Matematikte pek çok işlem, sonucu true veya false olarak döner:
-
Büyüktür
500 > 100→ true1 > 5→ false
-
Küçüktür
200 < 400→ true4 < 2→ false
-
Eşittir
5 == 5→ true500 == 400→ false
Diğer veri tiplerinde olduğu gibi, bir Boolean değeri de değişkende saklayabiliriz:
let myBool = 5 > 8; // false
5 sayısı 8’den büyük olmadığı için, myBool değişkeninin değeri false olur.
JavaScript ile daha fazla program yazdıkça, Boolean’ların nasıl çalıştığını daha iyi kavrayacaksınız.
Farklı fonksiyonlar ve işlemlerden dönen true veya false değerleri, programın akışını nasıl değiştirebilir göreceksiniz.
Diziler (Arrays)
Array (dizi), tek bir değişken içinde birden fazla değer tutabilir.
Bu sayede bir değer listesini diziye koyabilir ve üzerinde döngü ile işlem yapabilirsiniz.
Bir dizinin içindeki her bir öğeye eleman (element) denir.
Dizi elemanlarına indeks numarası kullanarak erişilir.
Nasıl string’ler tırnak içinde tanımlanıyorsa, diziler de köşeli parantezler [ ] içine yazılarak tanımlanır.
Örneğin, string’lerden oluşan bir dizi şöyle görünür:
// Balık isimlerini içeren bir dizi tanımlıyoruz
let baliklar = ["köpekbalığı", "mürekkep balığı", "palyaço balığı", "yılan balığı"];
Konsola yazdırdığında şu çıktıyı alırsın:
["köpekbalığı", "mürekkep balığı", "palyaço balığı", "yılan balığı"]
Diziler çok esnek bir veri tipidir çünkü değiştirilebilirler; yani içlerindeki elemanların değerleri eklenebilir, çıkarılabilir ve değiştirilebilir.
Nesneler (Objects)
JavaScript’te object (nesne) veri tipi, birden fazla değeri anahtar:değer (name:value) çiftleri şeklinde tutabilir. Bu yapı sayesinde verileri saklamak ve onlara erişmek oldukça kolaydır.
Nesne tanımlarken süslü parantezler { } kullanılır ve her özellik (property) anahtar:değer mantığında yazılır.
Genellikle birbiriyle ilişkili bilgileri tutmak için tercih edilir. Örneğin, bir kullanıcının kimlik bilgileri (ID, isim, e-posta gibi) tek bir nesne altında toplanabilir.
Aşağıda tamamen hazırlanmış bir JavaScript nesnesi var:
let balik = {ad: "Ahmet", soyad: "Köpekbalığı", renk: "mavi", konum: "okyanus"};
Alternatif olarak, nesneleri tek satırda yazmak yerine satır satır da yazabiliriz. Özellikle çok fazla özellik varsa bu yöntem okunabilirliği bayağı artırır. Ayrıca : işaretinden sonra bir boşluk bırakmak da göze daha hoş gelir.
let balik = {
ad: "Ahmet",
soyad: "Köpekbalığı",
renk: "mavi",
konum: "okyanus"
};
Yukarıdaki örneklerde oluşturduğumuz balik nesnesinin 4 özelliği vardı: ad, soyad, renk ve konum.
Her özellik, anahtar: değer şeklinde yazıldı ve bu çiftler aralarına virgül konularak ayrıldı.
Kısaca:
- ad → "Ahmet"
- soyad → "Köpekbalığı"
- renk → "mavi"
- konum → "okyanus"
Nesnelerde temel mantık budur: solda özellik adı, sağda o özelliğe ait değer. Bu yapı sayesinde verileri düzenli ve ulaşılabilir şekilde tutabiliyoruz.
Bir program yazarken birden fazla veri tipi ile çalışırsın. Ancak genelde işlemler aynı veri tipi üzerinde yapılır. Yani sayılarla matematiksel işlemler, metinlerle (string) ise parçalama ya da birleştirme işlemleri yapılır.
Bazen bir operatör, farklı veri tipleriyle de kullanılabilir. Örneğin + operatörü hem sayıları toplar hem de metinleri yan yana ekler. Ama işin içine farklı tipler girince işler karışabilir.
Mesela bir sayıyla bir string’i + ile birleştirdiğinde, sayı da string gibi davranır ve sonuç sadece yan yana ekleme olur. Ayrıca veri tiplerinin sırası, elde edilen sonucu etkiler.
Örneğin şu şekilde bir değişken tanımlarsak, JavaScript her öğeyi string olarak yorumlar:
let o = "Okyanus" + 5 + 3;
Eğer bu örnekte oluşturduğumuz o değişkenini çağırırsan, JavaScript sana şu değeri döndürecektir:
Output
Okyanus53
Ama eğer önce sayılarla başlarsan, JavaScript önce bu sayıları toplar. Daha sonra program "Okyanus" string’ine geldiğinde, elde edilen toplamı string’e çevirip onunla birleştirir.
let o = 6 + 7 "Okyanus" ;
Output
13Okyanus
Bu tarz beklenmedik sonuçlar yüzünden genelde işlemlerini tek bir veri tipi içinde yapman daha güvenli olur. Yani sayılarla çalışıyorsan sadece matematik işlemleri yap, stringlerle uğraşıyorsan sadece metin işlemleri yap.
JavaScript’in ilginç yanlarından biri ise şudur: farklı veri tiplerini karıştırdığında sana hata fırlatmaz. Bazı diğer programlama dilleri hemen uyarı verirken, JavaScript durumu kendi içinde yorumlamaya çalışır.
Bu da hem esneklik sağlar hem de bazen can sıkıcı sürpriz sonuçlara yol açabilir.
Sonuç
Artık JavaScript’te kullanabileceğin temel veri tipleri hakkında daha net bir fikir sahibi oldun.
Bu veri tipleri, ileride yapacağın projelerde karşına sık sık çıkacak ve her biri kendi yerinde oldukça önemli olacak. Kısacası, hangi veri tipini nerede kullanacağını bilmek, JavaScript öğrenme yolculuğunda büyük bir avantaj sağlar.