JavaScript Temelleri

Bölüm 3

Global JavaScript Nesnesi

Bölüm 3 Sayfa 2

3.3 - Global JavaScript Nesnesinin Fonksiyon Özellikleri (Metotları)

3.3.1 - eval() Metodu

eval () Metodu, kod içeren bir karakter dizgisinin kodlarını değerlendirir (evaluate) ve çalıştırır. Bu metot, bir tür JavaScript kodlarını çalıştırma ortamı olarak işlev yapar. Sözdizimi,

eval("Kod İçeren Karakter dizgisi");
		

şeklindedir. eval() metodunun argümanı isteğe bağlıdır. Fakat, argümansız bir eval() metodu, undefined değerini döndürecektir. eval() metodu, önce argümanı olan karakter dizigisinin sözdizimini (sentaks) kontrol edecek, sözdizimi doğru ise, karakter dizigisi argümanda bulunan tüm ifadeleri sırası ile değerlendirecek ve sonuncu ifade bir değerse o değeri, bir ifade ise ifadeyi değerlendirerek sonuç değerini döndürecektir. Bu metot, bir tür makro değerlendirme yazılımı olarak da düşünülebilir. Bu düşünce ile, eval() metodunun argümanı olan karakter dizgisine, ardarda çalışabilecek JavaScript kodları konulabilir. eval() Metodu, argümanındaki en son ifadenin sonucunu döndürecektir.

Daha önceleri eval() metodunun soysal (generik) Object nesnesinin metodu olarak da ikinci bir tanımı yapılmışsa da, bu tanım ECMA v.3 Standardına alınmamış ve artık devam ettirilmemektedir. Günümüzde, eval() metodunun tek yasal tanımı, ECMA v.3 Standardında belirtilen tek tanım olan, Global JavaScript Nesnesinin, bir metodu olarak tanımıdır. Aşağıda, eval() metodunun bir uygulamasının JavaScript kodları verilmiştir. Bu uygulama, web sayfasında bir verinin alınıp, hesap sonucunun yine aynı sayfada görüntülenmesinin yöntemini içerdiğinden, aynı zamanda JavaScript ifadelerini on-line deneme olanağı sağladığından dolayı çok önemlidir ve çok iyi incelenmelidir.

/* <![CDATA[ */

// Bu Program bdelib-style.js Kitaplık Programından Yararlanmaktadır.

function işlem(a,b) {

var f = null, t= null;

f= document.getElementById(a);
f.onclick = function() {
document.getElementById('sonuç').value = eval(document.getElementById('veri').value);
return false;
};
t=document.getElementById(b);
t.onclick=function(){
document.getElementById('sonuç').value='';
document.getElementById('veri').value='';
return false;
};
}

function geriGit(kimlik) {
var x = null;
x = document.getElementById('kimlik');
x.onclick = function() {
window.history.back(-1);
return false;
};
}



function başlat() { 
işlem('makro', 'sil');
geriGit('tepe');
geriGit('alt');
}

sayfaYüklendiktenSonraÇalıştır(başlat);

/*   ]]>  */
		

eval() Metodunun bir başka ilginç uygulaması, standart olmayan ve her belge çözümleyiciye göre farklı özellikleri olan document , window gibi sayfa nesnelerinin özelliklerinin taranmasıdır. Bu özelliklerin iyi bilinmesi, programlarda doğru özelliklerin kullanılması için gereklidir. Bir programda, öntanımlı nesnelerin olmayan bir özelliği belirtilirse, programın bir hata oluşturması olasılığı gözardı edilmemelidir. Aşağıdaki JavaScript kodları, bu tip nesnelerin özelliklerinin taranması için gerekli program adımlarını vermektedir. Bu program, ilişkilendirilmiş olduğu web sayfasından çalıştırılabilecektir.

/* <![CDATA[  */
			
/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */


function özellikler() {


for (var özellik in eval(document)) {
döngüYaz(özellik + ' : ' + document[özellik], 'b3.3.1-uyg-1-sonuç-1');
}
}


sayfaYüklendiktenSonraÇalıştır(özellikler);

/* ]]> */
		

Bu programın sonucunu görmek için, uygulama, farklı belge çözümleyicilerle çalıştırılmalı ve öntanımlı nesnelerin özelliklerindeki farklar belirlenmelidir.

eval() Metodu, argümanı olan makroyu çalıştırmak için, yeni bir çalıştırma alanı açar, tüm kodlar değerlendirildikten sonra bu alan kapanır. JavaScript yorumlayıcısı, bu işlem için azımsanmayacak bir süre harcar. Bu nedenle, özellikle döngü içlerinde, eval() metodunun kullanılmaması sağlık verilmektedir. Bu zaman kayıplarının önemi, programdan programa değişir. Bazı durumlarda, programın amacına ulaşması için bir miktar zaman kaybını göze almak gerekir. Doğal olarak, zaman kaybettirici eylemlerden uzak durmak ve başka çözüm yöntemleri bulunabilirse, bunlara dönmek en iyi önlem olacaktır. Çoğunlukla eval() metoduna eşdeğer başka bir yöntem bulunabilir. Eşdeğer bir çözüm bulunamazsa, programın gecikme süresini kabullenmek gerekir. Fazla sayıda iterasyon yapılmazsa, günümüzdeki makine hızları, bu yöntemin gerektirdiği süreleri, tolere edilebilecek sınırlara indirmektedir. Özetle, öncelikle gerekli olan program adımları gereken yerlerde kullanılmalı ve ilk öncelik olarak programın sonuç vermesi sağlanmalıdır. Performans arttırıcı önlemler daha sonra denenerek devreye alınabilir.

3.3.2 - parseInt() Metodu

Sayısal değere çevrilebilecek bir karakter dizgisinin,sayısal tipe dönüştürüldükten sonra ondaklık kısmının kesilerek tamsayı kıamının döndürülmesi için, parseInt() metodu kullanılabilir. parseInt() Metodunun kullanılış şekli,

parseInt(Sayısala Çevrilebilir bir Karakter dizgisi, [sayı tabanı]);
		

Sayısala Çevrilebilir bir Karakter dizgisi = İçeriğinde Sayısal Karakter (ler) olan Karakter dizgisi.

Sayı Tabanı = 2 ile 36 arası bir sayı tabanı, eğer hiçbir sayı verilmezse, 0x ile başlayan sayılar hex (on altı tabanlı), 0 ile başlayan sayılar oktal ( 8 tabanlı) olarak alınır. Diğer sayılar on tabanlı olarak kabul edilir.

Görüldüğü gibi sayı tabanının belirtilmesi isteğe bağlıdır.

parseInt() Metodu sözel atgüman gerektirmesine karşın, sayısal argümanla da çağrılabilir. JavaScript yorumlayıcısı, kendine özgü uyarlama(coercion) yeteneği ile, sayısal Veriyi sözel veriye dönüştürerek parseInt() metodunu çalıştıracak ve sonucu döndürecektir.

Javascript programlama dilinde tek sayısal bir tip vardır. Tamsayılar ile kayan noktalı sayılar aynı sayısal veri tipini paylaşırlar. Bu nedenle, ondaklı bir değeri olan bir değişkenin değerini bir tamsayıya çevirmek için, aşağıda görüldüğü gibi,

n = 98.34;

n = 98;

şeklinde bir tahrip edici atama ile değişkenin yeni değerini tanımlamak yeterli olacaktır.

parseInt() Metodunun bir uygulamasının JavaScript programı aşağıda görülmektedir. Bu kodlar, bağlı olduğu uygulama sayfasında çalışmaktadır.

...
var veri = 67.89;
veriYaz(veri, ...
veriYaz(parseInt(veri), ..

Program Sonucu :

Veri : Veri Tipi :

Sonuç : Sonuç Tipi :

Sonuçtan görüldüğü gibi, öncelikle parseInt() metodunun argümanı bir karakter dizgisi olması gerekirken, doğrudan doğruya bir sayısal veri argüman olarak kullanılmıştır. JavaScript yorumlayıcısı, bu sayısal veriyi kendi içinde sözel veriye çevirerek, parseInt() metodunun argümanı olarak kullanmıştır. Bu uyarlama (coercion) JavaScript yorumlayıcısının dinamik karakterinden kaynaklanmaktadır. Ayrıca, parseInt() Metodunun uygulanması ile, geri döndürülen değer, argümanın bir üst tamsayıya yuvarlatılmamamış, sadece ondalık kısmı kesilmiş olan tamsayı değeridir. parseInt ()Metodu, bir yuvarlatma metodu değildir. Sayıların yuvarlatılması için daha ileride göreceğimiz, Global JavaScript Nesne sınıfının öntanımlı Number alt nesne sınıfının, öntanımlı toFixed()metodu kullanılmalıdır.

parseInt() metodunun tamsayı olarak hareket edecek bir sayısal tipte değer oluşturabilmesi için, argümanının sayısal bir değere dönüştürülebilecek nitelikte bir karakter dizgisi olması gereklidir. Aksi halde NaN (Not a Number) sonucu oluşur. Örnek :

var semt = 'Tarabya';

var semtNr = parseInt('Tarabya');

Sonuç : NaN

parseInt() Çok güçlü bir fonksiyondur. parseiInt() Metodu, argümanı olan karakter dizgisini soldan başlayarak tarar ve argümanında sayıya çevrilebilir bir veri bulursa, bu veriyi tamsayı değerinde sayısal bir veriye dönüştürür. Aşağıda görülen JavaScript programı uygulama sayfasında çalışmaktadır. Bu programın karakter dizgisi verisinin başlangıcında, sayıya dönüştürülebilen bir kısım bulunmaktadır. parseInt() Metodu, bu veriyi tarar, başlangıçtaki sayıya dönüştürülebilen kısmı bir tamsayı değere dönüştürür ve verinin geri kalan kısmını gözardı eder.

...
var tk = '118 Sabahat Nurcihan 34 Sokak No:56', mb = null;
mb = parseInt(tk);
veriYaz(mb, ..

Program Sonucu :

mb: Veri Tipi :

Birçok verinin, tek bir karakter dizgisine yerleştirilebildiği profesyonel uygulamalarda, bu özellik adeta bir çözümleyici (decoder) işlevini görebilmektedir. Daha karmaşık durumlarda kendi çözümleyicilerimizi yazmamız gerekir ki, bu da veri yapısını bildikten sonra hiç de zor olmayacaktır.

Yukarıdaki örneklerden görüldüğü gibi, parseInt() metodu, açık (explicit) olarak kayan noktalı verileri tam sayı değerlere dönüştürmek için kullanılabilecek JavaScript yöntemlerinden biridir. parseInt() Metodu, bu dönüşümü, ondalıklı verinin, ondalık kısmını keserek gerçekleştirir. Bu nedenle parseInt() metodu, sözel verileri sayısal tipe dönüştürmek için genel bir yöntem olarak kullanılamaz.

3.3.3 - parseFloat() Metodu

parseFloat() Metodu, bir karakter dizgisinin bir ondalıklı sayıya dönüştürülmesi için kullanılır. Söz Dizimi,

parseFloat.(Sayıya Dönüştürülebilen Bir Karakter Dizgisi);
		

şeklindedir. Metodun argümanı olan sayıya dönüştürülebilen bir karakter dizigisi, içeriğinde sayılar olan bir karakter dizgisidir. Metodun bir argümanla birlikte kullanılması zorunludur. Metot, geriye bir ondalıklı değer döndürür. Argümanı olan ve sayısal bir değere dönüştürülebileceği varsayılan karakter dizgisi, sayısal değere dönüştürülemezse, NaN değeri döndürülür. Örnek :

...
a = parseFloat('Emel' //NaN değeri döndürülür. a = NaN olur.
...
a = parseFloat('123.123'); //123.123 değeri döndürülür. a = 123.123, tipi sayısal (number) dir.
		

Değerin gerçekten NaN olup olmadığı, bir sonra incelenecek metot olan, isNaN() metodunun uygulanması ile anlaşılabilir.

parseFloat() Metodu, aynı parseInt() metodu gibi argümanı olan karakter dizgisini soldan başlayarak tarar, sayıya çevrilebilir bir veri bulabilirse bu veriyi sayısal bir değere dönüştürür ve verinin geri kalan kısmını gözardı eder. Bu konuda bir uygulama sayfasında çalışan JavaScript kodları ve uygulama sonucu aşağıda görülmektedir :

var bilgi = '1.67e-3-birinci çevrim-123' , qt = null;

qt=parseFloat(bilgi);

veriYaz(qt, ....

Program Sonucu :

qt : Veri Tipi :

Bu sonuç, parseFloat() metodunun, parseInt() metodundan daha genel bir kapsamı olduğunu belirtmektedir. parseFloat() metodu, tüm sayıya dönüştürülebilecek karakter dizigisi tipindeki verileri, sayısal tipe çevirebilir. Sonuç, bir tamsayı ise, tamsayı olarak, sonuç bir ondalıklı sayı ise, ondalıklı sayı olarak kullanılır.

3.3.4 - isFinite() Metodu

isFinite() Metodu, argümanınn, makinenin çalıştırabileceği sınırlar içinde bir sonlu sayı olup olmadığını kontrol eder. Sonuç olumlu ise mantıksal true sonucunu verir. Kullanımı,

isFinite(sayı);
		

şeklindedir. Bu metodu sınamak için lütfen birinci uygulamadaki eval() makrosunu kullanınız. Örnek;

isFinite(1/200);
		

Sonuç : true

olarak görülmektedir.

3.3.5 - isNaN() Metodu

isNaN() Metodu, argümanının geçerli bir sayı olup olmadığını kontrol eder. Sonuç olumlu ise, yani argüman bir sayı değilse mantıksal true sonucunu döndürür. Bu metot, parseInt() ve parseFloat() gibi ifadelerin sonucunu kontrol etmek için çok yararlıdır. Kullanımı,

isNaN(sayı);
		

şeklindedir. Bu metodu sınamak için lütfen birinci uygulamadaki eval() makrosunu kullanınız. Örnek;

isNaN(parseFloat('1/200'));
		

Sonuç : false

olarak görülmektedir. Yani, argümanın gerçek bir sayı olduğu belirtilmektedir.

3.3.6 - encodeURI() ve encodeURIComponent() Metotları

encodeURI() Metodu, bir karakter dizgisini Uniform Resource Identifier (URI) olarak kodlar. Sözdizimi,

encodeURI('Metin');
		

şeklindedir.

encodeURI() metodu, kodlanmış bir URI değerini geri döndürür. Geri döndürülen değer, bir decodeURI()metoduna beslenirse, yeniden orijinal metin parçasına geri dönülür. encodeURI() metodu,":", "/", ";", ve "?" karakterlerini kodlamaz. Bu karakterlerin kodlanması için, encodeURIComponent () metodunun, kullanılması gerekir. Kodlamanın başarısı için verinin UNIX tipi yer bilgisi içeren, yani klasör ayrımını düz kesme (slash) ile belirten bir Karakter dizgisi literal olması gerekir. Aksi halde, 'file:///f:\myfiles\noway.htm' de \n, escape newline olarak nitelendirip yanlış sonuç üretecektir. Doğru ifade, 'file:///f:/my files/noway.htm' olmalıdır. Bu ifade, hem UNIX (LINUX) hem de WINDOWS işletim sisteminde çalışacaktır.

Günümüzde URI değerleri her türlü karakteri kabul ettiği için bu metodun artık kullanım gerekçesi kalmamış gibidir.

Örnek :

encodeURI('http://www.muğlayöresi.com');
		

Sonuç:

http://www.mu%C4%9Flay%C3%B6resi.com

3.3.7 - decodeURI() ve decodeURIComponent() Metotları

decodeURI() Metodu, kodlanmış URI yazılımını çözer. decodeURI() Metodunun sözdizimi,

decodeURI('URI');
		

şeklindedir. decodeURI() Fonksiyonun argümanı, kodlanmış bir URI yazılımı olan bir karakter dizgisidir. decodeURI() Fonksiyonu, geriye içeriği kodu çözülmüş bir URI değeri olan bir karakter dizgisi gönderir. Eğer argüman olan URI karakter dizgisi geçerli bir URI kodlaması değilse, bir URI hatası oluşur.

Artık devam ettirilmeyen unescape() metodu yerine, decodeURI() metodu kullanılmalıdır.

Örnek :

decodeURI('http://www.mu%C4%9Flay%C3%B6resi.com');
		

Sonuç:

http://www.muğlayöresi.com

Valid XHTML 1.1