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