Menu

JavaScript Primitive Tipler: 7 Temel Veri Tipi

JavaScript'teki yedi primitive tip — string, number, bigint, boolean, null, undefined ve symbol — ve bunların objelerden farkı.

Yedi Primitive Tip ve Geri Kalan Her Şey

JavaScript'te değerler iki kampa ayrılır. Bir tarafta yedi adet primitive tip vardır; bunlar basit ve değiştirilemez (immutable) değerlerdir. Diğer tarafta ise nesneler bulunur: bileşik, değiştirilebilir ya da çağrılabilir olan her şey. Değer seviyesinde tip sistemi aslında bundan ibarettir.

Yedi primitive tip şunlardır:

index.js
Output
Click Run to see the output here.

Bu listede olmayan her şey — diziler, fonksiyonlar, tarihler, regex'ler, sade {} nesneleri — birer object'tir. typeof operatörü sana çalışma zamanında tipi verir ama son satırda meşhur bir tuhaflık göreceksin. typeof null ifadesi 1995'ten beri 'object' döndürüyor ve bu asla düzeltilmeyecek; çünkü mevcut kodun çok büyük bir kısmı bu davranışa bel bağlamış durumda.

Primitive Bir Değerdir, Kutu Değil

En çok işe yarayan zihinsel model şu: bir primitive, kendi değerinin ta kendisidir. 3 sayısı, içinde 3 saklayan bir kutu değil — o doğrudan 3'ün kendisi. 3 tutan iki değişken, paylaşılan bir şeye işaret eden iki kopya değil, aynı değeri tutuyor demektir:

index.js
Output
Click Run to see the output here.

Primitive'ler değer üzerinden karşılaştırılır, nesneler ise referans üzerinden. Bu tek ayrım, ileride === ile dizileri ya da nesneleri karşılaştırırken yaşayacağın pek çok "bu neden false dönüyor ki?" anının baş sorumlusudur.

JavaScript'te Primitive Tipler Değiştirilemez (Immutable)

Bir primitive değeri değiştiremezsin. Değiştiriyormuş gibi görünen her işlem aslında yeni bir değer üretir:

index.js
Output
Click Run to see the output here.

İlk çağrı yeni bir string üretip çöpe atıyor, çünkü dönen değeri yakalayan kimse yok. İkincisi ise name değişkenine yeniden atama yapıyor. Orijinal "ada" değerine hiç dokunulmadı — zaten dokunulamazdı da. Sayılarda da durum aynı: x + 1 yeni bir sayı üretir, x'i değiştirmez.

İşte bu yüzden string veya number için const kullanmak gerçekten güvenli. Değerin kendisi değişemez, const de değişkeni yeniden atamanı engeller.

Number, BigInt ve neden iki ayrı tip var?

JavaScript'teki number tipi 64-bit float'tır. Bu sayede aritmetik hızlıdır ama bir tavanı vardır — tam sayılar yalnızca Number.MAX_SAFE_INTEGER (2^53 - 1) değerine kadar kesin olarak temsil edilebilir:

index.js
Output
Click Run to see the output here.

Bu eşiğin ötesinde tam sayılar çakışmaya başlar. İşte bigint tam olarak bu noktada devreye giriyor: boyutu ne olursa olsun kesinliğini koruması gereken tam sayılar için var. Bir sayının sonuna n ekleyerek bigint oluşturursun:

index.js
Output
Click Run to see the output here.

bigint ile number aritmetik işlemlerde birbirine karışmaz — karıştırsaydı ek hassasiyetin bir anlamı kalmazdı. bigint'i veritabanı ID'lerinde, nanosaniye cinsinden zaman damgalarında ya da kriptografi işlerinde kullan. Normal aritmetik için number yeterli.

String'ler de Primitive

JavaScript'te string bir primitive tiptir, nesne değil — .length, .slice, .toUpperCase gibi metotlar sunuyor olsa bile:

index.js
Output
Click Run to see the output here.

Perde arkasında, bir string üzerinde metot çağırdığınızda JavaScript o stringi geçici olarak bir String objesine sarıp metodu çalıştırır ve hemen ardından o sarmalayıcıyı çöpe atar. Bu detayı kafanıza takmanıza gerek yok — aklınızda kalması gereken şu: string'ler zengin bir metot yüzeyine sahip olsalar da aslında birer değer gibi davranırlar (immutable'dır ve değere göre karşılaştırılırlar).

Tek tırnak, çift tırnak ve ters tırnak (backtick) hepsi aynı tipi üretir. Backtick'in ek olarak iki süper gücü vardır: string interpolasyonu ve çok satırlı string yazabilmek. Bunlara bir sonraki dokümanda değineceğiz.

null ve undefined farkı

JavaScript'te "değer yok" anlamına gelen iki primitive tip vardır ve bunlar birbirinin yerine kullanılmaz.

undefined, bir şeye hiç değer atanmadığında karşınıza çıkar — tanımlanmış ama değer verilmemiş bir değişken, eksik bırakılmış bir fonksiyon argümanı ya da var olmayan bir property gibi:

index.js
Output
Click Run to see the output here.

null, "bilerek boş bıraktım" demek istediğinde senin yazdığın şeydir:

index.js
Output
Click Run to see the output here.

Genel teamül şöyle: undefined, dilin "burada bir şey yok" deme şekli; null ise programcının aynı şeyi söyleme şekli. İkisi de falsy değer; ikisi de normal değerlerle eşitlik karşılaştırmasında başarısız olur. Her birinin kendine ait ayrı bir sayfası da ilerleyen bölümlerde gelecek.

Symbol: Tasarım Gereği Benzersiz

symbol, en az kullanılan primitive tiptir. Oluşturduğunuz her symbol benzersizdir; iki tanesini aynı açıklamayla üretseniz bile durum değişmez:

index.js
Output
Click Run to see the output here.

Symbol'ler, mevcut anahtarlarla çakışmayacak nesne anahtarları olarak işe yarar — bir kütüphane, nesnelerinize symbol kullanarak metadata iliştirebilir ve başka hiçbir kodun bunun üzerine yazmayacağından emin olabilir. Bu tiple ileride iterator'lar ve Symbol.iterator gibi well-known symbol'ler konusunda tekrar karşılaşacaksınız.

Çalışma Zamanında Tip Kontrolü: typeof Operatörü

Çoğu durumda typeof operatörü işinizi görür. Ama şu tuhaflıkları aklınızın bir köşesinde tutun:

index.js
Output
Click Run to see the output here.

null kontrolü için doğrudan karşılaştırma yapın: value === null. Dizilerde Array.isArray(value) kullanın. "Bu değer herhangi bir primitive mi?" diye sormak istediğinizde tek bir hazır fonksiyon yok, ama yaygın kullanılan kalıp gayet açık:

index.js
Output
Click Run to see the output here.

Primitive Tipler ve Objeler: Atamadaki Klasik Tuzak

Konuyu kapatmadan önce görmeye değer bir şey daha var. JavaScript'te primitive tipler değerlerle, objeler ise referanslarla çalıştığı için, atama (=) işlemi bu iki tarafta çok farklı davranıyor:

index.js
Output
Click Run to see the output here.

Primitive'lerde b = a değerin kendisini kopyalar. Nesnelerde ise y = x referansı kopyalar — iki isim de aynı nesneyi gösterir. Birinden değiştirdiğinde diğeri de etkilenir. JavaScript'te "ama bu niye değişti ki?" diye başlayan hataların büyük çoğunluğu tam olarak buradan çıkar.

Akılda Kalması Gerekenler

  • Yedi tane primitive tip var: string, number, bigint, boolean, null, undefined, symbol. Geri kalan her şey nesnedir.
  • Primitive'ler değiştirilemez (immutable) ve değere göre karşılaştırılır; nesneler ise değiştirilebilir ve referansa göre karşılaştırılır.
  • typeof operatörü sana çalışma zamanındaki tipi söyler. Ezberlemeye değer iki tuhaflığı var: typeof null === "object" ve typeof function === "function".
  • number 64-bit kayan noktalı sayıdır ve güvenli tam sayı için bir tavanı vardır; bu tavanın üstünde kesin tam sayılarla çalışmak istiyorsan bigint var.

Sırada: String'ler ve Template Literal'lar

String, günlük kodda en çok elleyeceğin primitive tip. Template literal'lar (şu backtick'li string'ler) ise string üretmeyi çok rahat hale getirir — değişken araya sıkıştırma (interpolation), çok satırlı metinler, tagged template'ler hepsi orada. Bir sonraki sayfada bunları konuşacağız.

Sıkça Sorulan Sorular

JavaScript'te kaç tane primitive tip var?

Yedi tane: string, number, bigint, boolean, null, undefined ve symbol. Bunların dışındaki her şey — diziler, fonksiyonlar, tarihler, düz objeler — aslında birer object'tir. Bir değerin tipini çalışma zamanında typeof ile kontrol edebilirsiniz; tek tarihsel tuhaflık ise typeof null ifadesinin 'object' döndürmesidir.

JavaScript'te primitive ile object arasındaki fark nedir?

Primitive'ler değişmez (immutable) değerlerdir ve değere göre karşılaştırılır — iki tane 3, aynı 3'tür. Object'ler ise değişebilir (mutable) ve referansa göre karşılaştırılır — iki {} birbirine benzese bile farklı objelerdir. Primitive atarken değer kopyalanır; object atarken ise aynı veriye olan referans kopyalanır.

JavaScript primitive'leri gerçekten immutable mi?

Evet. Bir primitive'i yerinde değiştiremezsiniz — 'hello'.toUpperCase() orijinali değiştirmez, yeni bir string döndürür. x = x + 1 gibi bir atama yaptığınızda da aslında değişkenin değerini farklı bir primitive ile değiştirmiş olursunuz; orijinal değere dokunulmaz. İşte bu yüzden const name = 'Ada' tanımlansa bile name üzerinden yeni string'ler üretebilirsiniz.

typeof null neden 'object' döndürüyor?

Bu, 1995'teki ilk implementasyondan kalma bir hatadır ve çok fazla kod bu davranışa bağımlı olduğu için hiç düzeltilmedi. null kontrolü için === kullanın: value === null. undefined kontrolü içinse value === undefined veya typeof value === 'undefined' yazabilirsiniz.

Coddy ile kodlamayı öğren

BAŞLA