JavaScript Temelleri

Bölüm 9

String (Karakter Dizgisi) Nesne Sınıfı

Bölüm 9 Sayfa 1

9.1 - String (Karakter Dizgisi) Nesne Sınıfı Örnekleri Yapılandırıcısı

Öntanımlı dizi nesne sınıfı örnekleri yapılandırıcısının kullanımı

KarakterDizgisiSınıfıNesneÖrneği = new String(["Değer"]);
		

veya

KarakterDizgisiSınıfıNesneÖrneği = new String(['Değer']);
		

şeklindedir. İleride, JavaScript kullanımı ile web içeriğinin yaratılacağı AJAX uygulamalarında kolaylık olması ve kd (karakter dizgisi) değişkenlerinin web içeriği ile karışmamasının sağlanması için, ikinci kullanım yöntemi sağlık verilir.

Yeni karakter dizgisi nesne sınıfı örnekleri yapılandırıcısı String () fonsiyonun argümanı olarak kullanılacak karakter dizigisi literalinin oluşturulmasında, klavye karaktererli yanında, Unicode giriş noktaları da hex değerleri olarak kullanılabilir. Bunun için Bölüm 2.3.6 da açıklayıcı bilgi bulunmaktadır.

Klavyede bulunmayan karakterlerin, Unicode giriş noktası kodu olarak, karakter dizigisi verilere yüklenmesinin örneği olarak , bir Unicode tablosundan alınmış olan, Arap harflerine ait bir karakterin, bir karakter dizigisi nesne örneğinin bir karakteri olarak yüklenmesi örneğini uygulayan bir JavaScript programı ve ilişkilendirilmiş olduğu uygulama sayfasında vermiş olduğu sonuçlar, aşağıda görülmektedir:

...
var cimArabi = new String('\u062C');

veriYaz(cimArabi,'b9.1-uyg-1-sonuç-1', 'b9.1-uyg-1-sonuç-2');
...
		

Program Sonucu :

Program Unicode karakterlerinin sonuçlarında görüntülenmesi sayfanın yayınlandığı belge çözümleyicisinin görüntülecek Unicode karakterlerini desteklemesine bağlıdır. Veriler ise, program kodlarında saklı kalacaktır. Unicode giriş noktalarının burada hex kodları olarak belirtildiğine dikkat edilmelidir.

Sonuç :     Sonuç Tipi :

Eğer kd sınıfı nesne örnekleri yapılandırıcısı sıfır argümanla uygulanırsa, örnek olarak,

ağaçlar = new String();
		

şeklinde bir uygulama, ağaçlar adında boş bir kd sınıfı nesne örneği yaratır. Buna kısaca boş kd nesne sınıfı örneği denilir.

Bir kd değişkeninin tanımlanması için en uygun yöntem, bu değişkenin ilkel kd veri tipinde,

ağaçlar ='';
		

şeklinde tanıtılmasıdır. Bir kd değişkenin doğrudan kd yapılandırıcısı ile kd sınıf örneği olarak yaratılması sağlık verilmez. Sadece, çok fazla iterasyon yapılan döngü gövdelerinde, ilkel kd tipinde tanımlanmış bir kd değişkeninin sürekli kd sınıfı metotlarından yararlanması gerekiyorsa, gereksiz gel-git işlemlerinin vakit kaybettirmesinin önlenmesi amacı ile, kd değişkeni, kd sınıf örneği olarak tanımlanabilir.

Karakter dizigisi sınıf örnekleri yapılandırıcı fonksiyonu olan String() fonksiyonunun iki tane özelliği bulunmaktadır. Bunlardan biri, prototype özelliği, diğeri ise, fromCharCode() metodudur.

9.1.1 - String (Karakter Dizgisi) Nesne Sınıfı Örnekleri Yapılandırıcısının fromCharCode() Metodu

Bu metot, bir sentetik kd nesne örneği yapılandırıcısıdır. Kullanımı,

değişken = String.fromCharCode ( [ karakterKodu0 [, karakterKodu1 [ , ...] ] ] );
		

şeklindedir. Burada,

değişken : Değeri ilkel kd verisi tipinde bir değişken.

karakterKodu : Ondalıklı sayı olarak Unicode giriş noktası kodu. Çok kullanılan karakter kodları için Unicode değerleri, ek1 de verilmiştir. Her türlü Unicode giriş noktası değerleri için, çok kullanışlı bir kaynak, olarak Alan Wood’s Unicode Resources sayfası sağlık verilir. Unicode giriş noktaları, ilk 128 ondalık değer için ASCII ondalık değerleri ile aynıdır. Türkçe karakterlerin bulunduğu Unicode sayfası, (256-383) arası ondalık kodların bulunduğu Latin Extended-A sayfasıdır.

Bu metodun işleyişi için örnek bir JavaScript programı ve ilişikli olduğu bir uygulama sayfasında verdiği sonuçlar aşağıda görülmektedir:

...
function kdYarat() {

var yeniKd = '';

yeniKd = String.fromCharCode(84,85,286);

veriYaz(yeniKd,'b9.1.1-uyg-1-sonuç-1', 'b9.1.1-uyg-1-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Program sonucunda oluşturulan kd verisinin ilkel kd veri tipinde olduğuna dikkat edilmelidir. Dikkat edilecek bir başka nokta da, bu metodun, kd sınıfı örneklerine uygulanabilecek bir bir metot değil, sadece kd nesne yapılandırıcı fonksiyonuna ait özgün ve özel bir metot olmasıdır. Karakter dizgisi nesne örnekleri yapılandırıcı fonksiyonu olan String()fonksiyonu, fonksiyon nesne sınıfına ait bir nesne örneğidir. Bu nesne örneğine ait olan fromCharCode() metodu, sadece String(), fonksiyonuna ait bir metottur. Bu metot, sadece bir nesne sınıf örneği olan String(), fonksiyonuna ait olduğundan, fonksiyon nesne sınıfının diğer örneklerinde bu metot tanımlı değildir. Aynı şekilde, bu metot sadece kd sınıfı yapılandırıcı fonksiyonuna ait olduğu ve kd nesne sınıfı prototipine ait olmadığı için, kd sınıfı nesne örneklerinde de geçerli değildir.

9.1.2 - String (Karakter Dizgisi) Nesne Sınıfı Örnekleri Yapılandırıcısının prototype Özelliği

Karakter dizgisi nesne örnekleri yapılandırıcısının prototype özelliğinin değeri, boş bir kd sınıf nesne örneğidir. Bu nesne örneğine kısa olarak, kd sınıfının prototip nesnesi veya kd sınıfının prototipi adı verilir.

Kd sınıfının prototipinin içsel [[Class]] değeri "String" olarak açıklanmıştır.. Bu değer, kd sınıfının prototip nesnesinin yeni bir nesne sınıfının örneği olduğunu belirtir. Kd sııfını prototipinin içsel [[Prototype]] özelliğinin değeri, generik nesne sınıfı prototip nesnesidir. Bu değer, kd ("String") sınıfı prototipinin generik nesne (Object) sınıfı prototipinden türediğini, ve kd sınıfının, generik nesne sınıfının bir alt sınıfı olduğunu açıklar. Bu şekilde Object sınıfına ait tüm özellik ve metotlar, kd nesne sınıfında da geçerli olacaktır.

Kd nesne sınıfının prototipinin tüm özellik ve metotları, kd nesne sınıfının örneklerinde geçerlidir. Bu yüzden kd sınıfının prototipinin özellik ve metotlarına ait uygulama örnekleri, gerçek uygulamalar olan, kd sınıfı nesne örnekleri üzerinde yapılmıştır.

9.2 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin Özellikleri

9.2.1 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin constructor Özelliği

İncelemiş olduğumuz diğer sınıf prototiplerinde olduğu gibi, kd sınıfı prototipinin constructor özelliğinin değeri, bu sınıfın yapılandırıcı fonksiyonu olan String() fonksiyonudur. Bu fonksiyon, öntanımlı bir fonksiyon (native code) olduğundan, yazılımı kullanıcıya kapalıdır. Bu yüzden tüm öntanımlı fonksion yazılımları gibi yanıtı olmayacağı bilinen bir sorgulama olacaktır.

9.2.2 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin toString() Metodu

Karakter dizigisi sınıfının toString() metodu, bir kd sınıfı nesnesinin içeriğini ilkel kd değerine dönüştürür ve bu değeri döndürür. Bu metodun sözdizimi,

this.toString()
		

şeklindedir. Burada, this değeri doğrudan kd sınıfı prototip nesnesi olabildiği gibi, kd nesne sınıfı prototipi de olabilir. Bu sorgulama aşağıda görülen bir JavaScript programı ile yapılarak, iliştirildiği sayfada verdiği sonuç aşağıda görülmektedir:

...
function kdDeğeri() {
veriYaz(String.prototype.toString() ,'b9.2.2-uyg-1-sonuç-1', 'b9.2.2-uyg-1-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Yukarıdaki programda bir çıktı elde edilemeyeceği açıktır. Çünkü, kd nesne sınıfının prototip nesnesi olan kd nesnesi boş bir kd nesnesidir ve ilkel kd değerine dönüştürülecek bir içeriği yoktur. Yine de, boş kd olmakla birlikte geri döndürülen değerin veri tipi, ilkel kd değeridir.

Gerçek anlamı olan bir uygulama, kd nesne örneklerinin ilkel kd değerlerine dönüştürülmeleri uygulamalarıdır. Aşağıda görülen bir JavaScript programında bir kd nesne örneğinin içeriği, ilkel kd değerine dönüştürülmektedir. Burada this değeri, bir kd nesne sınıf örneğidir. Bu programın iliştirildiği sayfada verdiği sonuç aşağıda görülmektedir:

...
function kdDeğeri2() {
var veri = new String('Türkiye');
veriYaz(veri.toString() ,'b9.2.2-uyg-1-sonuç-1', 'b9.2.2-uyg-1-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Bu son programda gerçek bir uygulama gerçekleştirilmiş ve bir kd nesne örneğinin içeriği, kd ilkel değerine dönüştürülmüştür.

Burada incelediğimiz toString() metodu, biraz sonra göreceğimiz valueOf() metodu ile aynı sonucu vermektedir.

9.2.3 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin valueOf() Metodu

Karakter dizigisi sınıfının valueOf() metodu, bir kd sınıfı nesnesinin içeriğini ilkel kd değerine dönüştürür ve bu değeri döndürür. Bu metodun sözdizimi,

this.valueOf()
		

şeklindedir. Burada, this değeri doğrudan kd sınıfı prototip nesnesi olabildiği gibi, kd nesne sınıfı prototipi de olabilir. Fakat, kd nesne sınıfı prototipinin boş bir kd olduğu gözönüne alınırsa, anlamlı sonuçların sadece içeriği olan kd sınıfı nesne örnekleri ile alınabileceği açıktır. Aşağıda görülen bir JavaScript programı ile, bu dönüştürme yapılarak, programın iliştirildiği sayfada verdiği sonuç, aşağıda verilmiştir:

...
function kdDeğeri2() {
var veri = new String('Türkiye');
veriYaz(veri.valueOf() ,'b9.2.3-uyg-1-sonuç-1', 'b9.2.3-uyg-1-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Bu son uygulama sayfasında görülen sonuçlar, valueOf() metodunun aynı toString() gibi metodu gibi, kd nesne örnekleri içeriklerinin kd ilkel değerlerine dönüştürme için kullanılabileceğini göstermektedir.

9.2.4 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin charAt() Metodu

Karakter dizigisi sınıfının charAt() metodu, bir kd sınıfı nesne örneğinin belirtilen konumda bulunan karakterini ilkel kd değerine dönüştürür ve dönüştürdüğü değeri geri döndürür. Eğer belirtilen konumda, bir karakter yoksa, geriye boş bir kd döndürür.

Bir kd nesnesi sınıf örneğinin içeriğindedeki karakterin konumu, içeriğin bir skaler diziye benzetimi ile anlaşılabilir. İçeriği oluşturan karakterlerin konumları, en soldan 0 konumu ile başlar ve birer artarak kd içeriğinin sonuncu karakterine kadar devam eder. En sonuncu karakterin konumu, tüm içeriğin toplam karakter sayısı olan length özelliğininin değerinin bir eksiğidir. Yani bir kd nesne örneği olan this için,

İlk Karakterin Konumu = 0
Son Karakterin Konumu = this.length - 1
Toplam Karakter Sayısı = this.length

olarak belirlenir. Bu metodun sözdizimi,

this.chatAt(konum);
		

şeklindedir. Kd sınıfı prototipinin (kd sınıf nesnesi) boş bir kd nesnesi örneği olduğu bilindiğine göre, String.prototype.length = 0 olacaktır. Bu durumda, this değerinin yalnızca, içeriği olan bir kd nesne sınıfı örneği olması gerektiği açıktır. Bu konuda, bir JavaScript programı ile iliştirildiği sayfada verdiği sonuç aşağıda görülmektedir:

...
function karakter() {
var veri = new String('Türkiye');
veriYaz(veri.chatAt(0), 'b9.2.4-uyg-1-sonuç-1', 'b9.2.4-uyg-1-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Sonucun bir kd paketleyici nesne sınıfı örneği (String Object) olmayıp ilkel bir kd veri tipi (string) tipinde olduğuna dikkat edilmelidir.

Burada incelenen this.charAt(konum) ifadesindeki konum sayısal değeri bir tamsayı ise, bu ifade ile, biraz ileride göreceğimiz, this.subString(konum, konum + 1) ifadesi aynı sonucu verecektir.

9.2.5 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin charCodeAt() Metodu

Karakter dizigisi sınıfının charCodeAt() metodu, bir kd sınıfı nesne örneğinin belirtilen konumda bulunan karakterinin Unikod giriş noktası değerini hessaplar ve bu değeri döndürür. Doöndürülecek sayı 216 dan küçük olacaktır. Eğer bu konumda bir karakter yoksa, geriye NaN değeri döndürülecektir. Bu metodun sözdizimi,

this.chatAt(konum);
		

şeklindedir. Kd sınıfı prototipinin (kd sınıf nesnesi) boş bir kd nesnesi örneği olduğu bilindiğine göre, aranacak bir karakteri de yoktur. Bu durumda, this değerinin yalnızca, içeriği olan bir kd nesne örneği olması en uygun this değeri olacaktır Bu konuda, aşağıda görülen bir JavaScript programı ile iliştirildiği sayfada verdiği sonuç aşağıda görülmektedir:

...
function karakter() {
var veri = new String('Sonsuz : \u221E');
veriYaz(veri.chatAt(9), 'b9.2.5-uyg-1-sonuç-1', 'b9.2.5-uyg-1-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Döndürülen sonuç, ondalıklı (on tabanlı) (desimal) bir ilkel sayısal değer olmaktadır.

Kd paketleyici nesne sınıfının charAt() metodu, tüm bir kd paketleyici nesne sınıfı örneğinin içeriğinin tüm karakterlerinin Unikod değerlerinin ondalıklı değerlere dönüştürülmesini sağlayabilir. Bu konuda aşağıda görülen bir JavaScript programı ve iliştirildiği sayfada verdiği sonuç aşağıda görülmektedir:

...
function karakterDizgisi(sözcük) {
var değerler = [], toplam = 0;

for (var i = 0; i < sözcük.length; i++ ) {
değerler[değerler.length] =  sözcük.charCodeAt(i); 
toplam += değerler[değerler.length - 1];
}

toplam = değerler[değerler.length ++];
return değerler;
}

function sözcükDeğerlendir() {
var ondalıklıKarakterKodları = [], veriAkışı = karakterDizgisi1('deneme'), karakterDizgisiToplamDeğeri = 0;

karakterDizgisiToplamDeğeri  = veriAkışı.pop();
ondalıklıKarakter Kodları = veriAkışı;
sonuçYaz('ondalıklıKarakter Kodları  = ', ondalıklıKarakterKodları, 'b9.2.5-uyg-2-sonuç-1');
sonuçYaz('Sözcüğün Toplam Değerlendirme Puanı = ', karakterDizgisiToplamDeğeri , 'b9.2.5-uyg-2-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Bu programda dikkat edilmesi gerken birçok nokta bulunmaktadır. İlk olarak, modern programlama prensiplerinden biri olan, bir fonksiyona tek giri ve tek çokış olması prensibine uygun olarak, fonksiyonda birden çok geri döndürülecek değer bulunduğunda, geri döndülecek değerler bir dizi altında toplanır ve bu dizi geri döndürülür. Geri döndürülen dizideki değerlere, dizi elemanlarına erişme yöntemleri kullanılarak erişilir. Bu fonksiyonda geri döndürülen değerler dizisinin son elemanı, dizinin ratingi sayılan, dizi karakterlerinin ondalıklı değerlerinin toplamıdır. Bu değer dizinin son elemanı olduğundan bir pop() işlemi ile kesilerek değerine erişilmiştir. Dizinin geri kalan elemanları ise, sözcüğün karakterlerinin konumlarına göre on tabanlı karakter karşılıklarıdır. Bu elemanlara da, istenilen döngü mekanizması ile erişilebilir.

Buradaki karakterDizgisi1() fonksiyonunda, değerler[değerler.length] ifadesi özellikle üzerinde durulmaya değer. Buradaki değerler dizisi, denüz boş iken, bu ifade, değerler[0] anlamına gelir. İlk eleman eklendiğinde ise, bir sonraki eleman, [1] pozisyonuna eklenir. Bu bir tür gizili dizi indisi belirtmek gibidir. Döngü aslında i döngü indisi ile devam ettirilmektedir. Atama işleminin sol tarafında başka bir dizi indisi, sağ tafaında başka bir dizi indisi kullanımı anlamsızıdır. Bu tür bir döngü ataması, birçok uygulama örneğinde verildiği için bu örnekte de de açıklanmıştır. Bu tür gizii döngü indisi kullanımı sağlık verilmez. Bunun üç sakıncası vardır. İlk sakıncası, bu tür gizili döngü indislerinin okunmasının zorluğudur. Bu zorluk ileride programın bakımını zorlaştıracaktır. İkinci sakıncası, bu ifadenin değerlendirilmesinin JavaScript yorumlayıcısına zaman kaybettireceğidir. Bu ifadenin değerlendirilmesi için her iterasyonda dizi uzunluğunun yeniden hesaplanması gerekmektedir. Sonuncu sakınca ise bir ifadenin iki tarafında iki ayrı döngü indisi kullanılmasınınn sakıncalı olduğudur. Bu Program, aşağıdaki yazılımı ile hem daha anlaşılabilir hem daha çabuk çalışabilir olacaktır:

...
function karakterDizgisi(sözcük) {
var değerler = [], toplam = 0;

for (var i = 0; i < sözcük.length; i++ ) {
değerler[i] =  sözcük.charCodeAt(i); 
toplam += değerler[i - 1];
}

toplam = değerler[i ++];
return değerler;
}

...
		

Bu programda, üzerinde durulması gereken bir başka nokta da, sözel bir verinin hesaplanan sayısal karşılığıdır. İki sözel verinin sayısal karşılığı aynı olursa, bu iki verinin birbirinin aynı olduğu varsayılır. Sorun, sözel verilerin yazılmalarındaki farkların sayısal karşılık değerlerini de farklı hale getireceği ve gereli uyuşmanın sağlanamayacağıdır. Bu şekilde 'dünya' ve 'Dünya' olarak yazılan iki sözel verinin farklı olduğu sonucu çıkacaktır. Oysa farklı olan sadece aynı sözcüğün farklı yazılmalarından kaynaklanan ratinglerinden başka birşey değildir. Sözcüklerin ikisinin de anlamları aynıdır. Bu yüzden sözcüklerin karşılaştırılmaları sorunlu ve güvensizdir. Sözel verilerin karşılaştırılmalarındaki hataların önlenmesi için, karşılaştırma öncesi bazı normalizasyon işlemleri yapılmalıdır. Örnek olarak, boşluklar giderilmeli, karakterlerin tümü küçük veya büyük harflere çevrilmeli, toplam karakter sayısının uyuşması kontrol edilmeli, düzenli deyimler adı verilen sözel verilerin desen veya şablon adı verilen kalıplara uyup uymadıkları denenmelidir. Ancak bu gibi normalizasyon işlemlerinden sonra, sözel verilerin uyuşup uyuşmadıkları kararları üzerindeki hatalar azaltılabilir. Düzenli deyimler hakkında başlangıç bilgileri ek 2 de verilmiştir.

9.2.6 - String (Karakter Dizgisi) Nesne Sınıfı Prototipinin concat() Metodu

Kd nesne sınıfı prototipinin concat() metodu, daha önce dizi sınıfında gördüğümüz concat() metodu ile aynıdır. Bir kd prensip olarak bir diziye çok benzer, dizi elemanları yerine tek karakterler geçmiştir. Bu şekilde, concat() metodu dizilerde, dizileri birbirlerine eklerken, kd lerde, kd değerlerini birbirlerine ekleme görevini yapar. Kullanımı aynen dizilerde olduğu gibi,

this. concat([kd1 [ , kd2 [ , ...]]])
		

şeklindedir. Bu konuda bir JavaScript programı ve bağlantılı olduğu sayfada verdiği sonuç aşağıda görülmektedir :

...
function kdEkle() {
var kd1 = new String('Atatürk'), kd2 = new String(' '), kd3 = new String('Orman'), kd4 = 'Çiftliği';
veriYaz(veri.concat(kd1, kd2, kd3, kd2, kd4),  'b9.2.6-uyg-1-sonuç-1', 'b9.2.6-uyg-1-sonuç-2');
}
...
		

Program Sonucu :

Sonuç : Sonuç Tipi :

Yukarıdaki uygulamada dikkat edilecek bir nokta, basit bir ilkel kd değeri olan kd4 değerinin de concat() metodu ile birleştirilecebilecek kd ler arasında olabileceğidir. İlkel veriler, nesne metotlarından yararlanabilirler. Bunun için JavaScript yorumlayıcısı gerektiğinde ilkel veriyi ilgili nesne paketleyicisi tipine çevririr. Örnek olarak, kd ilkel verisini, kd nesne sınıfı örneğine dönüştürür. Metodu uygular, sonucu alır ve veriyi yeniden başlangıç tipine döndürür. Bütün bunlar, kullanıcının haberi olmadan otomatik olarak ve yüksek performansla yürütülür. Yine de, bir döngü içinde çok sayıda bu gibi gel-gitler olursa az da olsa bir performans düşüşü yazşanır. Bunun için, böyle durumlarda, veriyi başlangıçta ilgili nesne paketleyicisi tipte tanımlamak, performans kaybını engeller.

Bu metodun döndürdüğü değer, kd nesne paketleyicisi sınıf örneği (String Object) değil, ilkel kd tipi değerdir (String value).

Bu metot, sıfır argümanla kullanılırsa, uygulandığı this nesnesini ilkel kd tipine dönüştürür.

Valid XHTML 1.1