Ders 06 / 21
İlkel Tipler
Yedi ilkel tip ve nesne ayrımı; tek sayı tipinin kayan noktalı gösterimi, özel sayı değerleri, dizgi, mantıksal değer, iki yokluk değeri ve sembol.
İçindekiler
Önceki konu adların nasıl bildirildiğini ve çözümlendiğini kurdu. Bu konu, adların bağlandığı değerleri ele alıyor. Programlama Temelleri kursundaki Temel Veri Tipleri dersinde tip, “değer kümesi ve o değerler üzerinde tanımlı işlemler” olarak tanımlanmıştı. Bu ders o tanımı JavaScript’in değer modeline uygular.
Model küçüktür: yedi ilkel tip ve bir nesne sınıfı. Küçüklüğün bedeli, her tipin taşıdığı kararların ağırlığıdır. Örneğin tek bir sayı tipi vardır ve tam sayılar için ayrı bir tip yoktur; bu tek karar, ilerideki birkaç dersin konusunu belirler.
Yedi İlkel Tip ve Nesneler
Bir değer ya ilkeldir ya da bir nesnedir. İlkel değerlerin içeriği değiştirilemez ve kendi başlarına özellik taşımazlar. Nesneler ise özellik kümesidir ve içerikleri değiştirilebilir.
typeof işleci bir değerin tipini metin olarak verir:
console.log(typeof 21.5); console.log(typeof "A1"); console.log(typeof true); console.log(typeof undefined); console.log(typeof null); console.log(typeof 9007199254740993n); console.log(typeof Symbol("olcum")); console.log(typeof { istasyon: "A1" }); console.log(typeof [1, 2]); console.log(typeof function () {});
number string boolean undefined object bigint symbol object object function
Çıktı iki noktada tipe birebir karşılık gelmez. Beşinci satırda null bir ilkel
değerdir, ama sonuç object’tir; Dil Sürümleri ve Standartlaşma dersinde anlatılan
geriye dönük uyumluluğun izidir. Son satırda function ayrı bir tip değildir;
fonksiyonlar çağrılabilir nesnelerdir ve typeof bunu ayrı bir değerle bildirir.
Yedi ilkel tip şunlardır: sayı, büyük tam sayı, dizgi, mantıksal değer, undefined,
null ve sembol. Bu dersin konusu bunlardan altısıdır; büyük tam sayı bir sonraki
dersin konusudur.
Sayı: Tek Bir Tip
JavaScript’te tam sayı ve gerçel sayı için ayrı tipler yoktur. number tipinin
tamamı, Bilgisayarlar Nasıl Çalışır kursundaki Kayan Noktalı Sayılar dersinde tanımlanan
IEEE 754 çift duyarlıklı gösterimdir: 64 bit, 1 bit işaret, 11 bit kaydırmalı üs, 52 bit
saklanan mantis.
Bu, iki doğrudan sonuç doğurur.
Birincisi, tam sayı yazımı ayrı bir tip üretmez:
console.log(Number.isInteger(23)); console.log(23 === 23.0);
true true
23 ile 23.0 aynı değerdir; ikisi de aynı bit örüntüsüne karşılık gelir. Bu yüzden
ilk derste Math.max sonucu 23 olarak yazılmıştı — kesir kısmı sıfır olan bir kayan
noktalı sayı, metne çevrilirken kesir gösterilmeden yazılır.
İkincisi, ikilik kesir olarak yazılamayan onluk değerler yaklaşık tutulur:
console.log(0.1 + 0.2); console.log(0.1 + 0.2 === 0.3);
0.30000000000000004 false
Bu sonuç bir sürpriz değil, gösterimin doğrudan sonucudur. Kayan Noktalı Sayılar dersindeki model burada birebir geçerlidir: ve değerleri ikilik kesir olarak sonlu yazılamaz, en yakın temsil edilebilir değere yuvarlanır ve toplama bu yuvarlanmış değerler üzerinde yapılır. Sonuç, ’ün temsiline değil, ona en yakın başka bir değere düşer.
Aynı derste kurulan pratik kural burada da geçerlidir: kayan noktalı değerler eşitlikle değil, tolerans ile karşılaştırılır. Para gibi kesinlik gerektiren büyüklükler ise en küçük birimi taşıyan tam sayılarla tutulur.
Tam sayıların güvenli aralığı da mantis genişliğinden gelir. Mantis 53 bit duyarlık sağladığı için, mutlak değeri değerini aşan tam sayılar birbirinden ayırt edilemez:
console.log(Number.MAX_SAFE_INTEGER); console.log(9007199254740992 === 9007199254740993);
9007199254740991 true
İki farklı tam sayının eşit çıkması, ikisinin de aynı temsil edilebilir değere yuvarlanmasındandır. Bu sınırın aşıldığı durumlar bir sonraki dersin konusudur.
Özel Sayı Değerleri
Gösterim üç özel değer taşır ve üçü de dilde doğrudan görünür:
console.log(1 / 0, -1 / 0, 0 / 0); console.log(Object.is(0, -0), 1 / -0);
Infinity -Infinity NaN false -Infinity
Sıfıra bölme hata vermez; sonsuzluk değeri üretir. Tanımsız işlemler NaN (not a
number) verir. NaN bir sayı değeridir ve tipi number’dır; adı, temsil edilen
şeyin bir sayı olmadığını söyler.
İşaretli sıfır da gösterimin parçasıdır: 0 ile -0 farklı bit örüntüleridir ama
eşitlik karşılaştırmalarında eşit sayılırlar. Ayrımı gören işlem Object.is’tir. -0
değeri çoğu hesapta görünmez; yalnızca sıfıra bölmede işareti belirlediği için önem
kazanır.
Dizgi
Dizgi tipi, metin taşır. Dizgiler tek tırnak, çift tırnak veya ters tırnak ile yazılır; ilk ikisi arasında davranış farkı yoktur. Ters tırnaklı biçim ayrı yeteneklere sahiptir ve Dizgiler dersinde ele alınacaktır.
const ad = "ölçüm"; console.log(ad.length); console.log(ad[0]); console.log(ad.toUpperCase()); console.log("A1".codePointAt(0));
5 ö ÖLÇÜM 65
Dizgi uzunluğu karakter sayısı değil, 16 bitlik kod birimi sayısıdır. Bilgisayarlar
Nasıl Çalışır kursundaki Karakter Kodlamaları dersinde tanımlanan vekil çift kavramı
burada görünür hale gelir: temel çok dilli düzlemin dışındaki bir kod noktası iki kod
birimiyle temsil edilir ve length bunu iki sayar.
console.log("😀".length);
2
Bu, dizgi tipini anlamanın anahtarıdır: dizgi bir kod noktası dizisi değil, kod birimi dizisidir. Ayrım, karakter sayma ve dilimleme işlemlerinde sonuç değiştirir.
Mantıksal Değer
Mantıksal tipin iki değeri vardır: true ve false. Karşılaştırmalardan üretilirler ve
koşullu yapıların girdisidir. JavaScript, mantıksal olmayan değerleri de koşulda
kullanılabilir sayar; hangi değerin doğru, hangisinin yanlış sayıldığı Doğruluk Değerleri
dersinin konusudur.
İki Yokluk Değeri
Çoğu dilde tek bir yokluk değeri bulunur. JavaScript’te iki tane vardır ve anlamları ayrıdır.
undefined, bir değerin hiç verilmemiş olmasıdır. Bildirilmiş ama atanmamış bir
değişken, var olmayan bir nesne özelliği ve karşılığı verilmemiş bir parametre bu değeri
taşır. Dil onu kendiliğinden üretir.
null, bilinçli olarak yerleştirilmiş bir yokluktur. Dil onu kendiliğinden üretmez;
program yazarı “burada değer yok” demek için atar.
const kayit = { istasyon: "A1", sicaklik: 21.5 }; console.log(kayit.nem); console.log("nem" in kayit); let sonrakiOkuma; console.log(sonrakiOkuma); const kalibrasyon = null; console.log(kalibrasyon);
undefined false undefined null
Ayrım ölçüm verilerinde doğrudan işe yarar. Bir kayıtta nem alanı hiç yoksa okuma
undefined verir; alan var ama sensör değer üretmemişse null yazmak, “ölçülmedi”
bilgisini korur. İkisi aynı şey değildir: birincisi verinin biçimiyle, ikincisi verinin
içeriğiyle ilgilidir.
Sembol
Sembol, her çağrıda benzersiz bir değer üreten ilkel tiptir. Aynı açıklama metniyle üretilen iki sembol birbirine eşit değildir:
console.log(Symbol("kaynak") === Symbol("kaynak"));
false
Kullanım alanı, nesnelere çakışma riski olmadan özellik eklemektir. Sembol anahtarlı özellikler sıradan anahtar listelerinde ve dizileştirmede görünmez:
const kaynak = Symbol("kaynak"); const kayit = { istasyon: "A1", sicaklik: 21.5, [kaynak]: "yerel dosya" }; console.log(Object.keys(kayit)); console.log(JSON.stringify(kayit)); console.log(kayit[kaynak]);
[ 'istasyon', 'sicaklik' ]
{"istasyon":"A1","sicaklik":21.5}
yerel dosya
Ölçüm kaydına eklenen köken bilgisi, kaydın veri içeriğini kirletmeden taşınmış oldu. Sembollerin dil içindeki ikinci görevi — nesnelerin belirli davranışlarını uyarlamak — bir sonraki kursun konusudur.
İlkel Değerler Değiştirilemez
İlkel bir değerin içeriği değiştirilemez. Dizgi üzerinde konum atama girişimi katı kipte hata verir:
const ad = "A1"; try { ad[0] = "B"; } catch (hata) { console.log(hata.name + ": " + hata.message); } console.log(ad);
TypeError: Cannot assign to read only property '0' of string 'A1' A1
Aynı işlem katı kipte olmayan bir betikte hata vermez; sessizce yok sayılır ve dizgi yine değişmez. Kod Çalıştırma Yolları dersinde anlatılan katı kip farkının ikinci örneğidir bu: davranış aynı, geri bildirim farklıdır.
Bu nedenle dizgi yöntemleri asla özgün değeri değiştirmez, her zaman yeni bir dizgi üretir. Programlama Temelleri kursundaki değiştirilemez–değiştirilebilir ayrımı burada tiplere göre kesindir: yedi ilkel tipin tamamı değiştirilemez, nesneler değiştirilebilirdir.
Ölçüm Kaydının Tipleri
Kursun ekseni olan veri, bu tiplerin bir araya gelmesidir:
const kayit = { istasyon: "A1", sicaklik: 21.5, nem: null, dogrulandi: false, }; for (const anahtar of Object.keys(kayit)) { console.log(anahtar, "->", typeof kayit[anahtar]); } console.log("eksik alan:", typeof kayit.basinc);
istasyon -> string sicaklik -> number nem -> object dogrulandi -> boolean eksik alan: undefined
Üçüncü satır bir hatırlatmadır: nem alanı null taşıdığı için typeof sonucu
object çıkar. Bir alanın gerçekten boş olup olmadığı typeof ile değil, doğrudan
karşılaştırmayla sınanır. Bu karşılaştırmaların hangi kurala göre yapıldığı Eşitlik
Karşılaştırmaları dersinin konusudur.
Özet
- Değerler ilkel ya da nesnedir; yedi ilkel tip vardır ve hepsi değiştirilemezdir.
typeof nullsonucuobject, fonksiyonların sonucufunction’dır; ikisi de tip listesine birebir karşılık gelmez.- Tek sayı tipi IEEE 754 çift duyarlıklı gösterimdir:
23ile23.0aynı değerdir, onluk kesirler yaklaşıktır ve güvenli tam sayı aralığı ile sınırlıdır. Infinity,-Infinity,NaNve-0gösterimin parçasıdır;NaNtipinumber’dır.- Dizgi uzunluğu kod birimi sayısıdır, karakter sayısı değil.
undefinedverilmemiş bir değeri,nullbilinçli yerleştirilmiş bir yokluğu belirtir.
Sonraki Adım
Güvenli tam sayı aralığının üstünde iki farklı tam sayının eşit çıkması, bu dersin çözümsüz bıraktığı tek noktadır. Sonraki ders bu sınırın aşıldığı durumları ve dilin buna verdiği yanıtı ele alacak: keyfi büyüklükte tam sayı taşıyan ayrı bir ilkel tip, onun işleçlerdeki davranışı ve sayı tipiyle karıştırıldığında ortaya çıkan hata.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.