24 Mayıs 2011 Salı

Javascript Programlama Dili - Bölüm 1

Yahoo! javascript mimarı Douglas Crockford'un javascript eğitim videolarını belki duymuşsunuzdur. Javascript bildiğimi düşünürken, aslında bu dilin birçok güzelliğinden haberdar olmadığımı bu videoları izleyince anladım.

Şimdi bu videoları tekrar izleyerek, özet olarak aldığım notları sizinle paylaşmak istedim. Hem İngilizce bilmeyen web programcıları bu bilgilerden faydalanmış olur, hem de elimizde gerektiği zaman bakabileceğimiz yazılı bir doküman bulunmuş olur. İnşallah faydalı olur temennisiyle başlıyorum:
Javascript'te Sayılar

Javascript'te sadece bir sayı tipi vadır: Double

Double tipi her zaman beklediğimiz gibi çalışmaz. Örneğin, double tipinde 0.1 0.2 = 0.30000000000000004'tür. Bu yüzden para ile ilgili hesaplar yapılırken çok dikkatli olmak gerekir. Double tipi ile ilgili bu problem bütün programlama dillerinde mevcuttur, javascript'e özel bir problem değildir.
NaN Değeri

NaN diye özel bir değer vardır. “Not a Number” (sayı değil) demektir. Tanımsız veya hatalı işlemlerin sonucu NaN olur. Herhangi bir işlemde sayılardan biri NaN ise, sonuç da NaN olur.

NaN hiçbir şeye eşit değildir. NaN'a da eşit değildir.

Pek mantıklı değil ama, typeof(NaN) = “number”dır.

Number(deger) şeklinde bir fonksiyon vardır. String tipli değeri sayıya çevirir. Eğer çevirme işleminde bir problem varsa sonuç NaN olur. Aynı işlem öneki ile de yapılabilir.
parseInt Deyimi

Sadece tamsayıları ayrıştırmak (parse etmek) için parseInt isimli bir fonksiyon vardır. Bu fonksiyon sayı olmayan ilk karakterde durur. parseInt kullanılırken taban mutlaka yazılmalıdır. Çünkü;
parseInt(“08”) = 0
parseInt(“08”, 10) = 10
String Tipi

String tipi mevcuttur. Char tipi mevcut değildir. Char için 1 karakter uzunluğunda string kullanılır.

String'ler sabittir. Oluşturulduktan sonra değiştirilemez. Örneğin 2. karakter “c” olsun veya 3. karakter'den sonra araya “sinan” ekle denilemez. Bu tür işlemler için yeni bir string oluşturulur.

String'lerde tek tırnak da çift tırnak da kullanılabilir. Bu ikisinin hiçbir farkı yoktur.

String(deger) şeklinde bir fonksiyon vardır. Verilen değeri string'e çevirir.

String'ler birer nesnedir ve charAt, concat, indexOf, ... gibi metotları vardır.
Boolean Tipi

2 adet boolean değer vardır: true ve false.

Boolean(deger) şeklinde bir fonksiyon vardır. Verilen değeri boolean'a çevirir. !! öneki ile de aynı işlem yapılabilir.
null Değeri

null değeri vardır. null hiçbir şey demektir.
undefined Değeri

undefined değeri vardır. Değişken ve parametrelerin varsayılan değeri undefined'dır. Değişken tanımlanırken başlangıç değeri verilmezse başlangıç değeri undefined olur. Nesnelerin olmayan bir üyesinin değeri istendiğinde sonuç undefined olarak döner.
False ve True kabul edilen değerler

Aşağıdaki değerler false kabul edilir:
false
null
undefined
"" (Boş string)
0
NaN

Yukarıdakiler hariç diğer tüm değerler (tüm nesneler dahil) true kabul edilir. “0” ve “false” tırnak içinde yazıldığı için birer string'dir ve dolayısıyla true kabul edilir.
Büyük/Küçük Harfler

Tüm anahtar kelimeler (keywords) küçük harftir. Bazı metotlar (fonksiyonlar) camelCase'tir.

Javascript büyük/küçük harfe duyarlıdır.
Nesneler ve Üyelerine Erişim

new Object() denilerek boş bir nesne oluşturulabilir. Daha önceden oluşturulmuş bir nesneye sonradan yeni üyeler (değişkenler, fonksiyonlar, vs.) eklenebilir.

Üyelere nesne.uye şeklinde veya nesne[“uye”] şeklinde erişilebilir.
Değişkenler

Herhangi bir tip, değişkende saklanabilir, fonksiyonlara parametre olarak gönderilebilir, fonksiyonlardan return ile döndürülebilir.

Değişkenlere değer olarak fonksiyon atanabilir.
var a = function() {
alert("merhaba");
};

Değişken adları harf, _ veya $ ile başlar, harf, rakam, _ veya $ ile devam eder.

Tüm değişken, parametre, üye ve fonksiyonlar gelenek üzere küçük harfle başlar. Kurucu fonksiyonlar (constructor'lar) büyük harfle başlar.
Öneki

öneki string'leri sayıya çevirmek için kullanılabilir.
”42” = 42
Number(“42”) = 42
parseInt(“42”, 10) = 42
”3” ( ”4”) = 7
== ve != Operatörlerinin Yerine === ve !== Operatörleri

== ve != operatörleri karşılaştırma için kullanılır. Ancak bunların yerine === ve !== kullanılması tavsiye edilir. Çünkü bu operatörler hem değerleri hem de tipleri karşılaştırır:
“4” == 4 işleminin sonucu: true
“4” === 4 işleminin sonucu: false
“4” != 4 işleminin sonucu: false
“4” !== 4 işleminin sonucu: true
&& Operatörü

Mantıksal && operatörü şu şekilde çalışır: a && b işleminde, a true kabul edilen bir değerse ise sonuç b'dir. a false kabul edilen bir değerse ise sonuç a'dır. Burada a ve b'nin boolean olması şart değildir. Dolayısıyla bu işlemin sonucu a veya b olacağı için, sonuç boolean olmak zorunda değildir.
if (a) {
return a.uye;
}
else {
return a;
}

Bu mantıkla, yukarıdaki ifade şu şekilde de yazılabilir:
return a && a.uye;
|| Operatörü

Mantıksal || operatörü şu şekilde çalışır: a || b işleminde, a true kabul edilen bir değerse ise sonuç a'dır. a false kabul edilen bir değerse ise sonuç b'dir. Aynı şekilde, burada a ve b'nin boolean olması şart değildir. Dolayısıyla bu işlemin sonucu a veya b olacağı için, sonuç boolean olmak zorunda değildir.
var sayi;
if (girilen_sayi) {
sayi = girilen_sayi;
}
else {
sayi = eleman_sayisi;
}

Bu mantıkla, yukarıdaki ifade şu şekilde de yazılabilir:
var sayi = girilen_sayi || eleman_sayisi;
! Operatörü ve !! Şeklinde Kullanımı

!a işleminde, a false kabul edilen bir değerse sonuç true, true kabul edilen bir değerse sonuç false olur. Bu mantıkla !!a işlemi, ya da başka bir deyişle !(!a) işlemi, a değerini boolean tipine dönüştürmek için kullanılabilir. !!”” = false, !!”sinan” = true olur.
Bitwise Operatörleri

Bitwise operatörleri &, |, ^, >>, >>> ve << kullanılırken, operand 32-bit işaretli tamsayıya dönüştürülür, sonra da tekrar 64-bit ondalıklı sayıya dönüştürülür. Bu yüzden, daha hızlı çalışır düşüncesiyle, örneğin sayıyı 2 ile çarpmak yerine bitleri kaydırma işlemi yapılırsa, tahmin edilenin aksine, bu işlem daha yavaş çalışır.
Deyimlere Etiket Verme

Deyimlere etiket verilebilir.
dongu: for (;;) {
...
if (...) {
break dongu;
}
...
}

Yukarıdaki kod parçasında görüldüğü gibi break deyiminin hangi döngüyü kıracağı belirtilebilir. Böylece, iç içe döngüler varsa, gerektiği takdirde, en dıştaki döngü kırılabilir.
switch Deyimi

switch deyiminde, switch değeri sayı olmak zorunda değildir. String de olabilir. Ayrıca, case değerleri sabit olmak zorunda değildir, ifade de olabilir.
Değişken Kapsamları

{ bloklar } değişkenler için kapsam belirtmez. Sadece fonksiyonlar kapsam belirtir. Yani bir fonksiyonun içinde tanımlanmış değişkenler fonksiyonun dışında kullanılamazlar. Ama fonksiyonun içindeki herhangi bir blokta tanımlanmış değişkenler, o fonksiyonun içinde her yerde (o bloğun dışında dahi olsa) kullanılabilir.
function f() {
for (var i = 0; i < 1; i ) {
var a = 5;
}
return a; // Hata vermez, 5 döndürür
}
Varolan Değişkenlerin Yeniden Tanımlanması

Aynı isimle 2 kez değişken tanımlanırsa, değişken sadece 1 kez oluşturulur ve bunun için hata üretilmez.
Kaynağı görüntüle

Yazdır
?
var a = "sinan";
var a = "ilyas"; // Hata vermez, önceden oluşturulmuş a değişkenine “ilyas” değerini atar
return Deyimi

return deyimi mutlaka bir değer döndürür. return'den sonra bir ifade yazılmamışsa (return;) undefined değeri döndürülür. Bunun bir istisnası vardır: Kurucu fonksiyonlarda varsayılan return değeri this'tir.

Hiç yorum yok:

Yorum Gönder