Ders 19 / 21
Dizgiler
Şablon dizgileri, dilimleme ve arama yöntemleri, yerel ayara bağlı harf dönüşümü, kod birimi ile grafem ayrımı ve sayı biçimlendirme.
İçindekiler
Çıktılar bu derse kadar console.log argümanlarıyla üretildi. Rapor metni yazmak,
dizgilerin kendi araçlarını gerektirir. Bu ders o araçları tanımlar ve İlkel Tipler
dersinde bırakılan bir konuyu — dizginin kod birimi dizisi olmasının pratik sonucunu —
tamamlar.
Dizgiler değiştirilemezdir; buradaki her yöntem yeni bir dizgi üretir, özgün değeri değiştirmez.
Şablon Dizgileri
Ters tırnakla yazılan dizgiler üç ek yetenek taşır: ifade yerleştirme, çok satırlılık ve kaçış kurallarının farklılığı.
const kayit = { istasyon: "A1", sicaklik: 21.5 }; const esik = 20; const sablon = `${kayit.istasyon}: ${kayit.sicaklik} C (${kayit.sicaklik > esik ? "esik ustu" : "esik alti"})`; console.log(sablon); const cokSatir = `istasyon: ${kayit.istasyon} sicaklik: ${kayit.sicaklik}`; console.log(cokSatir); console.log(`tirnak: "A1", ters tirnak: \`A1\`, dolar: \${kayit}`);
A1: 21.5 C (esik ustu)
istasyon: A1
sicaklik: 21.5
tirnak: "A1", ters tirnak: `A1`, dolar: ${kayit}
Yerleştirilen şey bir ifadedir; koşullar Koşullar ve Seçim dersindeki üçlü işleçle
yazılır. Her ifade metne çevrilir — Tip Dönüşümü ve Zorlama dersindeki metne çevirme
yordamı uygulanır, yani bir nesne yerleştirildiğinde [object Object] çıkar.
Satır sonu doğrudan yazılır; kaçış dizisi gerekmez. Ters tırnak ve dolar–süslü ayraç ikilisi kaçırılmak istendiğinde ters bölü kullanılır.
Kursta metin birleştirme şablon dizgileriyle yazılır. Gerekçe, + işlecinin Tip
Dönüşümü ve Zorlama dersinde görülen iki yüzlü davranışından kaçınmaktır: şablonda
sonucun metin olduğu sözdiziminden bellidir.
Dilimleme ve Bölme
const satir = "A1;21.5;48"; console.log(satir.length, satir[0], satir.at(-1)); console.log(satir.slice(0, 2), satir.slice(-2)); console.log(satir.slice(4, 2), satir.substring(4, 2)); console.log(satir.split(";")); console.log(satir.split(";", 2)); console.log(["A1", "21.5"].join(";"));
10 A 8 A1 48 ;2 [ 'A1', '21.5', '48' ] [ 'A1', '21.5' ] A1;21.5
Üçüncü satır iki dilimleme yönteminin ayrımını gösteriyor. slice negatif dizin kabul
eder ve başlangıç bitişten büyükse boş dizgi verir. substring negatif dizinleri
sıfır sayar ve argümanları gerekirse yer değiştirir; bu yüzden ;2 üretti. İki
sonucun aynı satırda boşlukla ayrılmış yazılması, ilkinin boş olduğunu gösteriyor. Kursta
slice kullanılacaktır: davranışı dizilerdeki slice ile aynıdır ve sürpriz üretmez.
split bir ayırıcıya göre böler ve ikinci argümanla sonuç sayısını sınırlar. Sınırlama
kalan metni son parçaya eklemez, atar — dosya ayrıştırırken beklenmedik veri kaybının
kaynağıdır.
Arama ve Değiştirme
const satir = "istasyon=A1;alan=sicaklik;alan=nem"; console.log(satir.includes("alan"), satir.indexOf("alan"), satir.lastIndexOf("alan")); console.log(satir.startsWith("istasyon"), satir.endsWith("nem")); console.log(satir.replace("alan", "ALAN")); console.log(satir.replaceAll("alan", "ALAN")); console.log(" A1 ".trim() + "|", " A1 ".trimStart() + "|"); console.log("A1".padStart(5, "0"), "A1".padEnd(5, "."), "-".repeat(10));
true 12 26 true true istasyon=A1;ALAN=sicaklik;alan=nem istasyon=A1;ALAN=sicaklik;ALAN=nem A1| A1 | 000A1 A1... ----------
replace metin argümanıyla çağrıldığında yalnızca ilk eşleşmeyi değiştirir;
tümü için replaceAll kullanılır. Bu, sessiz hata üreten bir ayrımdır.
Doldurma yöntemleri hizalı çıktı üretmenin temelidir ve dolgu karakteri verilebilir. Kırpma yöntemleri baştaki ve sondaki boşlukları atar; hangi karakterlerin boşluk sayıldığı standartta tanımlıdır.
Yerel Ayara Bağlı Harf Dönüşümü
Büyük–küçük harf dönüşümü dile bağlıdır ve öntanımlı yöntemler dilden bağımsız kuralı uygular:
const ad = "istasyon"; console.log(ad.toUpperCase()); console.log(ad.toLocaleUpperCase("tr")); console.log("ISTANBUL".toLowerCase()); console.log("ISTANBUL".toLocaleLowerCase("tr"));
ISTASYON İSTASYON istanbul ıstanbul
Fark, noktalı ve noktasız i harflerinin ayrı harfler olduğu dillerde ortaya çıkar.
Öntanımlı dönüşüm i harfini noktasız büyük harfe çevirir; yerel ayarlı dönüşüm noktalı
harfi üretir.
Buradan iki kural çıkar. Kullanıcıya gösterilecek metin dönüştürülüyorsa yerel ayar belirtilmelidir. Buna karşılık karşılaştırma amacıyla yapılan dönüşümde yerel ayarlı biçim kullanılmamalıdır: aynı metin farklı yerel ayarlarda farklı sonuç verir ve karşılaştırma tutarsızlaşır. Anahtar karşılaştırmaları dilden bağımsız biçimle yapılır.
Kod Birimi ve Grafem
İlkel Tipler dersinde dizginin kod birimi dizisi olduğu söylenmişti. Sonucu dilimlemede görünür:
const metin = "A1😀"; console.log(metin.length); console.log([...metin].length); console.log([...metin]); console.log(Array.from(metin).length);
4 3 [ 'A', '1', '😀' ] 3
length dört verdi çünkü son karakter iki kod biriminden oluşur — Bilgisayarlar Nasıl
Çalışır kursundaki vekil çift. Yayma ve Array.from, dizgiyi kod noktalarına göre
dolaşır ve üç eleman verir.
Kod birimi sınırında kesmek metni bozar:
const metin = "A1😀"; console.log(metin.slice(0, 3).length); console.log([...metin].slice(0, 3).join(""));
3 A1😀
İlk dilimleme, çift kod biriminin yalnızca ilkini aldı; ortaya tek başına anlamı olmayan bir kod birimi çıktı ve gösterildiğinde bozuk görünür. İkinci yol kod noktası dizisi üzerinde çalıştığı için karakteri bölmedi.
Grafem — kullanıcının tek karakter saydığı birim — kod noktasından da büyük olabilir; birleştirici işaretler bunun örneğidir:
const birlesik = "é"; const tek = "é"; console.log(birlesik.length, tek.length, birlesik === tek); console.log(birlesik.normalize("NFC") === tek);
2 1 false true
İki dizgi aynı görünür ama farklı kod noktası dizileridir; karşılaştırma yanlış verir. Normalleştirme ikisini ortak biçime getirir. Metin karşılaştırması yapan kod, girdileri önce normalleştirmelidir.
Sayı Biçimlendirme
console.log((21.456).toFixed(2)); console.log((0.1 + 0.2).toFixed(2)); console.log((1.005).toFixed(2)); console.log((21.5).toString(2)); console.log(String(1e21), String(1e-7));
21.46 0.30 1.00 10101.1 1e+21 1e-7
toFixed belirtilen basamak sayısına yuvarlar ve metin döndürür. Üçüncü satır
sürpriz gibi görünür ama İlkel Tipler dersindeki modelin sonucudur: 1.005 değeri kayan
noktalı gösterimde tam olarak temsil edilemez ve saklanan değer 1.005’ten biraz
küçüktür, bu yüzden aşağı yuvarlanır. Yuvarlama hatası biçimlendirmede değil, sayının
kendisindedir.
toString taban argümanı alır; Bilgisayarlar Nasıl Çalışır kursundaki İkilik Sayı
Sistemi dersindeki gösterim böyle üretilir. Son satır, çok büyük ve çok küçük sayıların
üstel gösterime geçtiğini gösteriyor; sınırlar standartta tanımlıdır.
Ölçüm Raporunu Yazmak
Bu dersin araçları birleştiğinde hizalı bir rapor çıkar:
const kayitlar = [ { istasyon: "A1", sicaklik: 21.5, nem: 48 }, { istasyon: "A2", sicaklik: 19.75, nem: 55 }, { istasyon: "B1", sicaklik: 23, nem: null }, ]; const baslik = `${"istasyon".padEnd(10)}${"sicaklik".padStart(9)}${"nem".padStart(6)}`; const cizgi = "-".repeat(baslik.length); const satirlar = kayitlar.map((k) => { const nemMetni = k.nem == null ? "-" : String(k.nem); return `${k.istasyon.padEnd(10)}${k.sicaklik.toFixed(2).padStart(9)}${nemMetni.padStart(6)}`; }); console.log([baslik, cizgi, ...satirlar].join("\n"));
istasyon sicaklik nem ------------------------- A1 21.50 48 A2 19.75 55 B1 23.00 -
Eksik nem alanı - ile gösterildi; == null denetimi Eşitlik Karşılaştırmaları
dersindeki istisnadır. toFixed(2) tüm sıcaklıkları aynı basamak sayısına getirdi —
23 değeri 23.00 olarak yazıldı. Satırlar join ile tek bir metne bağlandı ve tek
çağrıda yazıldı.
Hizalama kod birimi sayısına dayanır. Rapor Latin harfleri dışında karakterler içeriyorsa, doldurma yöntemleri görsel genişliği değil kod birimi sayısını dengeleyeceği için sütunlar kayabilir.
Özet
- Şablon dizgileri ifade yerleştirir, çok satırlıdır ve kursta metin birleştirmenin tek biçimidir.
slicenegatif dizin kabul eder ve ters aralıkta boş dizgi verir;substringargümanları yer değiştirir.replaceyalnızca ilk eşleşmeyi değiştirir; tümü içinreplaceAllgerekir.- Harf dönüşümü yerel ayara bağlıdır; gösterim için yerel ayarlı, karşılaştırma için dilden bağımsız biçim kullanılır.
lengthkod birimi sayar; kod noktası bazlı işlem için yayma veyaArray.fromkullanılır ve karşılaştırmadan önce normalleştirme gerekir.toFixedmetin döndürür ve yuvarlama, sayının kayan noktalı temsilinden etkilenir.
Sonraki Adım
Rapor okunabilir bir metin üretti, ama makinenin geri okuyabileceği bir biçim değil. Sonraki ders JSON’u ele alacak: dizileştirme ve ayrıştırma, biçimin desteklemediği değerler, döngüsel başvurunun ürettiği hata ve dönüşümü uyarlayan geri çağrılar. Büyük Tam Sayılar dersinde bırakılan dizileştirme sorunu da orada tamamlanacak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.