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 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 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.
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ü;
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.
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 vardır. null hiçbir şey demektir.
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.
Aşağıdaki değerler false kabul edilir:
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.
Tüm anahtar kelimeler (keywords) küçük harftir. Bazı metotlar (fonksiyonlar) camelCase'tir.
Javascript büyük/küçük harfe duyarlıdır.
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.
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 string'leri sayıya çevirmek için kullanılabilir.
== 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:
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;
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;
!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 &, |, ^, >>, >>> 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 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 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.
{ 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 }
Aynı isimle 2 kez değişken tanımlanırsa, değişken sadece 1 kez oluşturulur ve bunun için hata üretilmez.
var a = "sinan"; var a = "ilyas"; // Hata vermez, önceden oluşturulmuş a değişkenine “ilyas” değerini atar
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.