Karakter Dizisi - Strings

JavaScript metinsel değerleri karakter dizisi olarak tutar. Bir karakter ile (char) karakter dizisi (string) arasında bir fark yoktur.

Karakter dizisi formatı her zmaan UTF-16’dır ve sayfanın karakter setine bağlı değildir.

Tırnak İşaretleri

Tekrar hatırlayacak olursanız, Karakter dizisi tek tırnak ve çift tırnak ile açılıp kapatılabilir. :

let tek = 'tek-tırnak';
let cift = "çift-tırnak";

let us_isareti = `üs işareti`; // Backticks

Tek ve çift tırnak zaten aynıydı. Üs işareti ise JavaScript ifadelerini karakter dizisine yerleştirmenizi sağlar. Bu fonksiyon çağrısı dahil her şey olabilir:

function toplam(a, b) {
  return a + b;
}

alert(`1 + 2 = ${toplam(1, 2)}.`); // 1 + 2 = 3.

Üs işaretinin diğer avantajı ise birkaç satırdan oluşan bir karakter dizisini yazabilmeniz:

let davetliListesi = `Davetliler:
 * İhsan
 * Cemal
 * Muzaffer
`;

alert(davetliListesi); // birçok satırdan oluşan davetiye listesi

Eğer yukarıdaki şekilde tek veya çift tırnak kullanmaya kalkarsanız hata alırsınız:

let davetliListesi = "Davetliler:  // Error: Unexpected token ILLEGAL
  * İhsan";

Tek tırnak ve çift tırnak dil ilk yazılmaya başlandığı, çoklu satırların hesaba katılmadığı zamanlardan kalmadır. Garip tırnak ise ( alt + , ) çok sonraları oluşturulduğundan çok yönlüdür.

İlk üs işareti öncesinde “şablon fonksiyonu” tanımlanması da mümkündür. Yazımı : func`string` şeklindedir. func fonksiyonu otomatik olarak çağrılır, karakter dizisi ile ve içine gömülü ifadeyi alır ve çalıştırır. Bunun ile ilgili daha fazla bilgiyi dökümanda bulabilirsiniz. Buna “etiketmiş şablon” (tagged templates) denir. Bu şekilde karakter dizilerini özel temalar içerisinde veya diğer fonksiyonlarda kullanmak daha kolay olur, fakat yine de nadiren kullanılırlar.

Özel Karakterler

“yeni satır” \n karakterini kullanarak çift tırnaklı karakter dizisi içerisinde birçok satırdan oluşan bir metin yazılabilir:

let davetliListesi = "Davetliler:\n * İhsan\n * Cemal\n * Muzaffer";

alert(davetliListesi); // birçok satırdan oluşan davetiye listesi

Örneğin, aşağıdaki iki satırın çıktısı aynı olacaktır:

alert( "Merhaba\nDünya" ); // "yeni satır" sambolü ile iki satır.

// üs işareti ile iki satır ( altgr + , )
alert( `Merhaba
Dünya` );

“Yeni satır” karakterine göre daha az kullanılan “özel” karakterler bulunmaktadır:

Karakter Açıklama
\b Backspace
\f Form feed
\n Yeni Satır
\r Carriage return
\t Tab
\uNNNN hex kodu ile bir Unicode NNNN, örneğin \u00A9© kopyalama hakkı için kullanılan işaret. Kesinlikle 4 basamaklı hex değeri olmalıdır.
\u{NNNNNNNN} Bazı karakterler nadirde olsa iki Unicode sembolü ile ifade edilirler. 4 bytten oluşan uzun bir yazımı vardır. Karakterlerin süslü parantez içine alınması gerekmektedir.

Unicode örnekleri:

alert( "\u00A9" ); // ©
alert( "\u{20331}" ); // 佫, Uzun bir çince hiyerograf (uzun Unicode)
alert( "\u{1F60D}"); // 😍, gülen yüz sembolü (uzun Unicode)

Tüm özel karakterler her zaman \ karakteri ile başlarlar. Karakterler normal akışında giderken başka bir iş yapması için var olan işlemi kesmesinden dolayı “kesme karakteri” denebilir…

Karakter dizisi içinde kesme işareti kullanmak istersek bu işaret yardımıyla yaparız.

Örneğin:

alert( 'N\'aber canım - Tavşan !' ); // N'aber canım - Tavşan !

Gördüğünüz gibi \' kullanarak karakter dizisinin bitmesi engellendi.

Tabi bu sadece başlangıç karakteri ' ise geçerli. Daha düzgün bir çözüm çift tırnak kullanmak olacaktır:

alert( "N'aber canım - Tavşan!" ); // N'aber canım - Tavşan!

Dikkat edeceğiniz üzere \ JavaScript’in doğru okuması amacıyladır. Ekranda görünmez.

Peki gerçekten \ gösterilmek istenirse ne yapılmalı ?

Bu da mümkün, bunun için \\ kullanılmalı:

alert( `\\` ); //  \

Karakter dizisi uzunluğu

length özelliği karakter dizisinin uzunluğunu verir.

alert( `Naber\n`.length ); // 6

Dikkat ederseniz \n “özel karakter” olduğundan dolayı bir karakter olarak tanımlandı.

length bir özelliktir

Genelde başka diller ile çalışmış programcılar yanlışlıkla str.length yerine str.length() metodunu çağırmaktadırlar. Böyle bir metod yoktur.

str.length sayısal bir değerdir, fonksiyon değildir! Sonunda parantez açıp kapanmaz.

Karakterlere erişim

İstediğiniz pozisyondaki karakteri alabilmek için köşeli parantez içerisinde pozisyonu neresiyse onu yazın [poz] veya bunun yerine str.charAt(pos) metodunu da kullanabilirsiniz. İlk karakter 0. pozisyondur:

let str = `Selam`;

// ilk karakter
alert( str[0] ); // S
alert( str.charAt(0) ); // S

// son karakter
alert( str[str.length - 1] ); // m

Köşeli parantez karakter almanın modern yoludur, charAt ilk metodlardandır.

Aralarındaki tek fark [] eğer karakteri bulamaz ise undefined döner. Fakat charAt boş karakter döner:

let str = `Selam`;

alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (boş karakter)

Karakterleri döngüye sokmak da mümkündür.

for(let karakter of "Selam") {
  alert(karakter); // S,e,l,a,m (karakter önce "S", sonra "e", sonra "a" vs)
}

Karakterler tanımlandıktan sonra değiştirilemezler ( immutable )

JavaScript dilinde karakter dizisi değiştirilemez. Mümkün değildir.

Örnek ile açıklamak gerekirse:

let str = 'Selam';

str[0] = 's'; // hata
alert( str[0] ); // çalışmaz, değişiklik olmaz

Bunun çüzümü ise yeni bir karakter dizisi atayıp str’yi buna atamaktır.

Örneğin:

let str = 'Selam';

str = str[0] + 'ELAM' ;  // karakter dizisini tamamen değiştir.

alert( str ); // SELAM

Bir dahaki bölümde bunun ile ilgili daha fazla örneğe denk geleceksiniz.

Harf işlemleri

Küçük harfe çevirmek için toLowerCase() ve büyük harfe çevirmek için toUpperCase() metodları kullanılabilir.

alert( 'Arayüz'.toUpperCase() ); // ARAYÜZ
alert( 'Arayüz'.toLowerCase() ); // arayüz

veya, sadece baş harfini alıp küçük harf olmasını istiyorsanız istiyorsanız:

alert( 'Arayüz'[0].toLowerCase() ); // 'a'

Karakter dizisi içinde başka bir karakter arama

Bunun için birçok yol bulunmaktadır.

str.indexOf

İlk metod str.indexOf(aranacak_karakterler, pozisyon)

Aranmak istenen karakter dizisinde str aranacak_karakterler’i arar. Pozisyon ile istenen pozisyondan aramaya başlar, eğer bu karakter dizisini bulursa bulduğu pozisyonu, bulamaz ise -1 döndürür.

Örneğin:

let str = "N`aber Canım - Tavşan";

alert( str.indexOf("N'aber") ); // 0, çünkü N`aber başlangıçta
alert( str.indexOf("n'aber") ); // -1, bulunamadı, arama büyük/küçük harf duyarlıdır.

alert( str.indexOf("Tavşan") ); // 15, "Tavşan" 15. pozisyonda bulunmaktadır.

İsteğe bağlı olan ikinci parametre aramaya nereden başlanacağının belirtilmesine yarar.

Örneğin "an"'ın ilk bulunduğu pozisyon 8’dir. Bir sonraki denk gelişi ise 19. pozisyonda olur.

let str = "N`aber Canım - Tavşan";

alert( str.indexOf('an', 9) ) // 19

Eğer sizin istediğiniz tüm tekrarlar ise, indexOf’u döngü içerisinde kullanabilirsiniz. Her yeni çağrı bir önceki pozisyonu tutar:

let str = 'Bir berber bir berbere gel birader beraber bir berber dükkanı açalım demiş';

let hedef = 'bir';

let poz = 0;
while (true) {
  let bulunanPoz = str.indexOf(hedef, poz);
  if (bulunanPoz == -1) break;

  alert( `Bulunan poz: ${bulunanPoz}` );
  poz = bulunanPoz + 1; // bir sonraki pozisyondan aramaya devam et.
}

Aynı algoritma aşağıdaki şekilde daha kısa bir biçimde yazılabilir: