İçeriğe geç
academia.sh

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: 0,10{,}1 ve 0,20{,}2 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ç, 0,30{,}3’ü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 25312^{53}-1 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 null sonucu object, fonksiyonların sonucu function’dır; ikisi de tip listesine birebir karşılık gelmez.
  • Tek sayı tipi IEEE 754 çift duyarlıklı gösterimdir: 23 ile 23.0 aynı değerdir, onluk kesirler yaklaşıktır ve güvenli tam sayı aralığı 25312^{53}-1 ile sınırlıdır.
  • Infinity, -Infinity, NaN ve -0 gösterimin parçasıdır; NaN tipi number’dır.
  • Dizgi uzunluğu kod birimi sayısıdır, karakter sayısı değil.
  • undefined verilmemiş bir değeri, null bilinç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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat