Nəticə
• Artırma / azaltma nəticə istifadə edilməyəcəksə, formun seçimində fərq
yoxdur:
let counter = 0;
counter ++;
67
++ counter;
alert (counter); // 2, yuxarıdakı nümunə ilə eyni oldu.
• Dəyəri artımaq və nəticəni istifadə etmək istəyiriksə, post form -a
ehtiyacımız vardır:
let counter = 0;
alert (++ counter); // 1
• Dəyəri artırıb və nəticəni istifadə etmək istəmiriksə, prefix form- a
ehtiyacımız var:
let counter = 0;
alert (counter ++); // 0
Digər operatorlar arasında artış/azalış
++ / -- operatorları ifadələrin içərisində də istifadə etmək olar. Digər
operatorlardan əvvəl yerinə yeririlir.
Nümunə:
let counter = 1;
alert (2 * ++ counter); // 4
Müqayisə edək:
let counter = 1;
68
alert (2 * counter ++); // 2, çünkü counter ++ əvvəlki dəyəri qaytaracaqdır
Yəni alert 1 göstərəcəkdir.
“Tək sətir – tək əməliyyat” yazı tərzi:
let counter = 1 ;
alert (2 * counter);
counter ++;
Aralıq operatorları
Aralıq operatorları arqumentləri 32 bitlik say sistemi olaraq qəbul edir və
ikili say sistemində işləyir.
Bu operatorlar yalnız Javascriptə aid deyildir. Çox proqramlaşdırma dilləri
dəstləkləyir.
Operatarların siyahısı:
•VƏ ( & )
• VƏYA (|)
• XOR (^)
• DEYİL (~)
• SOL SİMVOL (<<)
• SAĞ SİMVOL (>>)
69
• SIFIRDAN SAĞ SİMVOL (>>>)
Bu operatorlar çox nadir hallarda istifadə edilir. Onları başa düşmək üçün
aşağı say sisteminə keçid etmək lazımdır və indi halda bunu etmək lazım
deyil. Çünki bunlara ehtiyacımız olmaycaqdır.
Yerindəcə dəyişdirmə
Ümumilikdə dəyişən üzərində operatordan istifadə etdikdə yeni dəyəri eyni
dəyişəndə saxlamaq lazımdır.
Məsələn:
let n = 2;
n = n + 5;
n = n * 2;
Bunun qısa yolu += və *= operatorlarından istifadə edərək yazmaqdır:
let n = 2;
n + = 5; // indi n = 7 (n = n + 5 ilə eynidir)
n * = 2; // şimdi n = 14 (n = n * 2 ilə eynidir)
alert (n); // 14
Bütün operatorların və aralıq operatorların qısa yazılış forması var: / =, - =, və
s.
70
Bu operatorlar normal bərabərlik kimi üstünlüyə malikdir. Bu səbəblə digər
operatorlardan sonra işləyirlər:
let n = 2;
n * = 3 + 5;
alert (n); // 16 (əvvəl sağ hissə hesablandı, n * = 8 ilə eynidir)
Vergül
Vergül operatoru maraqlı operatorlardan biridir. Qısa kod yazmaq üçün
istifadə edilir. Hər ifadədən sonra vergüldən istifadə edilir. Ancaq sonuncu
ifadə üçün istifadə edilmir.
Məsələn:
let a = (1 + 2, 3 + 4);
alert (a); // 7 (3 + 4-ün nəticəsidir)
Burda ilk ifadə 1+2 hesablanır və nəticə atılır. Daha sonra 3+4 hesablanır və
nəticə olaraq göstərir.
Vergül ən aşağı üstünlüyə malikdir
Vergül operatoru = operatorunda belə aşağı üstünlüyə malikdir. Bu səbəblə
yuxarıdakı nümunədə mörtərizənin olması vacibdir.
71
Bunlar olmadan : a= 1+2, 3+4 əvvəl + operatoru hesablandı. a=3, 7 oldu.
Sonra isə a=3 nəticəsini götürəcəkdir və sonrasına diqqət etmiyəcəkdir.
(a=1+2),3+4 kimi
Əgər sonuncunu nəzərə almıyacaqdısa niyə ehtiyacımız var buna?
Bəzən developerlər bir necə əməliyyatı bir sətirdə etmək üçün qarışıq struktur
hazırlayar.
Nümunə:
Bu cür texnikanı bir çox Javascript frameworkun-də istifadə edilir. Bu səbəblə
bunun izahını verdim.
// bir sətirdə 3 əməliyyat
(a = 1, b = 3, c = a * b; a <10; a ++) {
...
}
72
12.
Müqayisə operatorları
Riyaziyyatda bir çox müqayisə operatoru bilirik:
• Böyük / kiçik : a> b, a • Böyük / kiçik və ya bərabərdir: a>= b,
a<= b.
• Bərabərlik: a == b (diqqət çüt bərabərlikdir. Tək bir a = b simvolu bir
dəyişəni başqa dəyişənə bərabər etmə).
• Bərabər deyil. Riyaziyyatda ≠- bu cür yazılır. Ancaq Javascriptdə fərqli olaraq
nida vardır: a! = B.
Boolean nəticəsi
Digər bütün operatorlar kimi müqayisədə də dəyər verir. Bu halda da dəyər
booleandır.
• true - “bəli”, “düzgün” və ya “real” mənasını verir.
• false - “xeyr”, “yanlış” veya “real olmayan” mənasını verir.
Məsələn:
alert (2> 1); // true (düzgün)
alert (2 == 1); // yanlış (yanlış)
alert (2! = 1); // true (düzgün)
73
Müqayisənin nəticəsi hər hansı dəyişənə verilə bilər:
String müqayisəsi
Bir stringin digər stringdən böyük olub olmadığını yoxlamaq üçün
Javascriptdə “yazı” vəya “leksik” müqayisə edilir.
Başqa sözlə desək stringlər hərf hərf ilə müqayisə edilir.
Müqayisə:
İki stringin müqayisə alqoritması sadədir:
1. Hər iki stringin ilk simvolunu müqayisə edir.
2. İlk stringdən gələn simvol digər stringdən daha böyüksə (və ya daha az),
ilk string ikincidən böyükdür (və ya daha az). Yoxlanılmışdır.
3. Əks təqdirdə hər iki stringin də ilk simvolu eynidirsə, ikinci simvol eyni
şəkildə müqayisə edilir.
let netice = 5> 4; // müqayisənin
nəticəsi
alert (netice); // düzgün
alert ('Z'> 'A'); // düzgün
alert ('Glow'> 'Glee'); // düzgün
alert ('Arı'> 'Ol'); // düzgün
74
4. Hər hansı stringin sonuna qədər davam edir.
5. Hər hansı string də eyni uzunluğa sahibdirsə , o zaman bərabərdir. Əks
təqdirdə , daha böyük string böyükdür.
Yuxarıdakı nümunlərdə ,'Z'> 'A'
Qarşılaşdırılması ilk addımda nəticə verərkən, "Glow" ve "Glee" dəki
simvolları qarşılaşdırılacaq:
1. G, G ilə eynidir.
2. l, l ilə eynidir.
3. o, e'dən böyükdür. Burada isə ilk string daha böyükdür.
Bu qarşılaşdırma hərfə görə deyil Unicode-a görə edilir.
Məsələn: Böyük hərflə “A”, kiçik hərf “a” ilə eyni deyildir. Hansı daha böyükdür
bəs? Kiçik hər “a” böyükdür. Səbəb? Çünki kiçik hərfli simvol Javascriptin
istifadə etidiyi daxili şifrələmə cədvəlində daha böyük index-sə sahibdir
(Unidecode). Bunun String bölməsindəki spesifik əlamətlərinə və
qiymətlərinə geri qayıdacıq.
Fərqli tiplərin müqayisəsi
Fərqli tiplərin dəyərlərinin müqayisəsi zamanı Javascript dəyərləri ədədlərə
çevrilir.
Məsələn:
alert ('2'> 1); // true, '2' stringi 2 ədədinə çevriləcəkdir.
alert ('01' == 1); // true, '01' stringi 1 ədədinə çevriləcəkdir.
75
Boolean dəyərlər üçün true 1 və false 0 olur.
Məsələn:
Qəribə nəticələr
Eyni zamanda mümkündür:
• İki dəyər bərabərdir.
• Biri bir boolean olarak, diğeri ise bir boolean dəyər deyildir.
Məsələn:
alert (true == 1); // düzgün
alert (false == 0); // düzgün
a = 0;
alert (Boolean (a)); // səhv
b = "0";
alert (Boolean (b)); // düzgün
alert (a == b); // düzgün
76
JavaScriptə görə bu nəticə olduqca normaldır. Bərabərlik operatoru ədəd
olaraq çevirib yoxlayır. (bu səbəblə “0” 0 olur)
Qatı bərabərlik
Normal bərabərlik yoxlamasında səhvlik vardır. 0-i səhvdən ayıra bilmir.
alert (0== false); //düzgün
Eyni nəticə boş stringlədə olur :
alert (“ ” == false); // düzgün
Bunun səbəbi fərqli tipdəki dəyişənləri == operatoru ədədə (number)-ə
çevirməsidir. Boş string və 0 yanlış dəyəri kimi olacaqdır.
0 – ı yanlışdan ayırmaq üçün nə etməliyik?
Qatı bərabərlik operatoru ===, tipi çevirmədən bərabərliyi yoxlayacaqdır.
Başqa sözlə əgər a və b fərqli tiplərdədisə, o zaman a===b bərabərliyindən
çevirmədən false dəyərini döndərəcəkdir.
Yoxlayaq:
alert (0 === false); // false, çünki tiplər fərqlidir
Eyni zamanda “qatı bərabərlik” operatoruda vardır. Qatı operator ilə daha
dəqiq və xətalara daha az vermək üçün istifadə edilir.
Null və undefined müqayisəsi
77
İndi isə bu tiplərin müqayisəsinə baxaq
Boş və bilinməyən dəyərlərin digər dəyərlərlə qarşılaşdırılması zamanı
məntiqə uymayan nəticələr ortaya çıxır.
Qatı bərabərlik zamanı === bu dəyərlər fərqlidir, çünki hər biri fərqli tipdir.
Qatı olmayan bərabərlik zamanı üçün == isə xüsusi qayda vardır. Bu iki tip
bir-birinə bərabərdirlər.
alert (null == undefined); // düzgün
Riyazi və digər müqayisələr üçün <> <=> =
null / undefined ədədlərə çevrilir: null 0 , undefined NaN olacaqdır.
İndi bu qaydaları gördüyümüzdə qəribə hallara baxaq. Və daha vacibi onlara
necə aldanmamaq lazımdır.
Maraqlı nəticə
Null və 0-ı müqayisə edək:
alert (null> 0); // (1) yanlış
alert (null == 0); // (2) yanlış
alert (null> = 0); // (3) düzgün
Riyazi olaraq bu çox gözlənilməzdir. Son nəticə sıfırın sıfırdan böyük vəya bərabər
olduğunu düzgün qəbul edir. Bu səbəblə yuxarıdakı müqayisəni birinin düzgün
olması lazımdır. Ancaq ikisidə yanlışdır.
78
Bunun səbəbi bərabərlik operatorunun == və müqayisə operatorlarının > <> = <=
fərqli işləmə üsulunun olmasıdır. Müqayisədə null dəyəri rəqəmə çevrilərək 0
olacaqdır.
(3) null> = 0 düzgündür və (1) null> 0 yanlışdır.
Həmdə bilinməyən və null üçün bərabərlik yoxlaması == hər hansı çevrilmə
olmadan bərabər olacaqdır və başqa heç bir şeyə ehtiyac qalmayacaqdır. Bu
səbəblə (2) null==0 səhvdir.
Bərabəri olmayan undefined
Bilinməyən dəyər digər dəyərlərlə müqayisə edilməməlidir:
alert (undefined> 0); // yanlış (1)
alert (undefined <0); // yanlış (2)
alert (undefined == 0); // yanlış (3)
Niyə sıfırdan xoşu gəlmir? Hər zaman yanlış geri qaytarır.
Müqayisələr (1) və (2) yanlış dəyəri geri qaytarır. Çünki undefined NaN-a çevrilir və
NaN a bütün müqayisələr üçün false geri qaytaran xüsusi number tipidir.
Bərabərlik yoxlamasında (3) false geri qaytarır, çünki bilinməyən dəyər sadəcə boş
, bilinməyən və başqa dəyərlərə bərabər deyildir.
79
Problemlərdən yan keçmə
Niyə bu nümunələrə baxdıq? Bu xüsusiyyətləri hər zaman yadda saxlamalıyıqmı ?
Əslində indi çətin görünən bunlar zamanla yaddaşınıza yazılacaqdır. Ancaq onlarla
yaranan problemlərdən yan keçməyin metodu vardır:
Hər hansı müqayisəyə undefined/ null dəyərlərlə, qatı bərabərlik ===. İstisna
hallardan kənarda isə == operatoru ilə yoxlayın.
Müqayisələrlə > => <<= nə etdiyini tam olaraq bilmirsinizsə, null/undefined olacaq
dəyər istifadə etməyin. Bu dəyişən bu dəyərlərə sahibdirsə, bunları ayrı ayrı
yoxlayın.
Nəticə
Müqayisə operatorları Boolean dəyərləri geri qaytarır.
Stringlər – “söz” sırasında hərf hərf müqayisə edilir.
Fərqli tiplərin dəyərləri müqayisə edildiyində, çevrilmələr olur. (Qatı bərabərlikdən
başqa)
Dəyərlər əgər null və undefined-ə bərabərdirsə, digər heç bir dəyərə bərabər
olmayacaqdır.
> Vəya < kimi müqayisə istifadə edilərkən boş və ya undefined dəyərlər qarşı
diqqətli olun. Null/undefined ayrı ayrı yoxlamaq məsləhətdir.
80
13.
Dialoq pəncərələri : alert, confirm, prompt
Kitabın bu hissəsində real nümunələr olmadan Javascript dilində danışacıq.
Brauzerinizdən istifadə edərək dialoqların necə qurulacağına baxmalıyıq. Bu
bölmədə əsas brauzer funksiya bildirişləri, istək və təsdiqi haqqında
öyrənəcik.
Alert
Sintaksisi
alert (yazı);
Bu kod yazı göstərəcəkdir və istifadəçi “OK” -a klikləyənə kimi bütün
funksiyalar dayanacaqdır.
Məsələn:
Yazının olduğu kiçik pəncərəyə modal window deyilir.
Prompt
Bu metod iki arqument qəbul edir:
netice = prompt (başlıq, [default]);
alert ( "Salam");
81
Modal pəncərədə istifadəçidən bir dəyər istəyər və “OK/CANCEL” -
düymələrindən birinə kliklənməsini gözləyər.
Başlıq -
İsitfadəçiyə göstəriləcək yazı olacaqdır.
Default -
İstəyə görə ikinci parametrdir. Başlanğıç dəyər kimi qəbul edilir.
İsitfadəçi inputun daxilinə bir şey yazıb, “OK”-təsdiq və “Cancel”-ə vəya ESC
– düyməsini sıxıb imtina edə bilərsiniz.
Yazılmış nəticəni göndərir vəya yazılmayıbsa null dəyərini göndərəcəkdir.
Məsələn:
let yash = prompt ('Neçə yaşınız var?', 75);
alert (`$ {yash} yaşınız var!`); // 75 yaşın var!
İE-də : hər zaman default dəyər olmalıdır.
Bu əslində istəyə bağlı parametrdir. Ancaq İnternet Explorer “undefined”
olaraq görəcəkdir.
Nəticəni görmək üçün İnternet Explorerdə işə salın :
let test = prompt ("Test");
Bu səbəblə, İE-də həmişə default dəyəri yazmaq məsləhət görülür:
let test = prompt ("Test", ''); // <- IE üçün
82
Confirm
Sintaksisi:
netice = confirm (sual);
Funksiyanın təsdiqləməsi üçün istifadə edilən confirm iki düymədən ibarətdir:
OK və Cancel
OK düyməsi sıxıldıqda ya düzgün olarsa, True dəyəri, səhv olarsa, False
dəyərini verəcəkdir.
Nümunə:
let buLiderdir = confirm (“Lider sizsiniz?”)
alert (Mənəm); // OK basılarsa, true
Nəticə
İstifadəçilərlə brauzerdə əlaqə qurmaq üçün 3 metoda baxdıq:
Alert - Bildiriş mesajı göstərəcəkdir.
Prompt - İsitifadəçidən mətn tələb edən mesaj qutusudur. Ok basılarsa, mətni
göndərir vəya Cancel vəya ESC basılarsa, null dəyərini döndərəcəkdir.
83
Confirm - Mesajı göstərmək üçün istifadə edilir. İstifadəçidən “OK” və ya
“Cancel”-dən birinin kliklənməsini gözləyir. Ok- true dəyərini, Cancel/ESC
false dəyərini verəcəkdir.
Bütün bu metodlar modaldır: açılmış pəncərə bağlanana kimi digər bütün
funksiyalardan istifadəyə qadağan qoyacaqdır.
Yuxarıda bütün metod üçün standart vardır:
1.Modal pəncərəsi brauzerdə tərəfindən qəbul edilir. Adi halda mərkəzdə
olur.
2. Pəncərənin dizaynını brauzerə uyğun olaraq təyin olunur.
84
14. Şərt operatorları : if, “?”
Bəzə fərqli şərtlərə görə fərqli nəticələr almaq lazım olur. Bunu etmək üçün “sual
işarəsi” operatoru olaraq adlandırılan if ifadəsini və şərt operatorunu istifadə edə
bilərik.
“İf” ifadəsi
İf ifadəsi şərtlər qoymaq üçün istifadə edilir və nəticə düzdürsə, bir kod hissəciyinin
işləməsi üçün istifadə edilir.
Məsələn:
Yuxarıdakı nümunədə şərt sadə yoxlama nümunəsi oldu (year==2015), ancaq çox
qarışıqda ola bilər.
Birdən çox ifadə istifadə etmək istəyiriksə, kod hissəsini skopların içərisinə daxil
etmək lazımdır:
let il = prompt ('ECMAScript-2015 nə zaman
buraxılmışdır?' ');
if (il == 2015) alert (Düzdür!');
if (il == 2015) {
alert ("düzgündür!");
alert ("ağıllısan!");
}
85
İstfadə edəcəyimiz bir ifadə olsa belə kodlar skopların {} daxilində yazılmalıdır.
Həmdə oxunması rahat olacaqdır.
Boolean çevrilməsi
İf (…) ifadəsi skop içərisindəki kodları dəyərləndirib, nəticəni boolean tipini çevirib
göndərəcəkdir.
Tiplər arasında əlaqə bölməsini yada salaq:
•Dəyər 0, boş string “” , null ,undefined və NaN – false dəyəri alır.
• Qalan dəyərlər isə true olur.
Buna görədə düz olarsa, aşağıdakı kod heç vaxt işə düşməz:
… Və bu halda həmişə true dəyəri alır:
Əvvəlcədən düzgün dəyər qeyd edə bilərik. Nümunə:
if (0) {
// 0 false-dir.
...
}
if (1) {// 1 true
...
}
let cond = (il == 2015); // bərabər olarsa düz, əks halda səhv
olsun.
if (cond) {
...
}
86
“Else” ifadəsi
İf ifadəsin istəyə bağlə “else” bölməsi istifadə edilə bilər. Bu hissədə şərt əgər səhv
olan zaman işlədiləcək kod hissəciyi yerləşdirilir.
Nümunə:
Birdən çox şərt : “else if”
Bəzən şərt qoyarkən bir necə hal üçün yazmaq istəyə bilərik.
Else if buna imkan verir.
Nümunə:
let il = prompt ('ECMAScript-2015 neçənci ildə buraxılmışdır?' ');
if (il == 2015) {
alert ('Doğrudur!');
} else {
alert (Səhvdir'); // 2015 -dən başqa dəyər yazılarsa
}
87
Yuxarıdakı kodda Javascript ilk əvvəl <2015 ilini yoxlayacaqdır. Bu olmazsa, sonrakı
şərt olan il> 2015 yoxlayacaqdır. Buda səhv olarsa, sonuncu ifadəni işə salacaqdır.
Kod blokları çox ola bilər. Sonuncu istəyə bağlıdır.
Şərt operatoru “?”
Bəzən dəyişən vermək lazım olur.
Məsələn:
let il = prompt ('ECMAScript-2015 neçənci ildə
buraxılmışdır?' ');
if (2015 < il) {
alert ('Bu ildən sonra olub ...');
} else if (il> 2015) {
alert ('Bu ildən əvvəl olub');
} else {
alert ('Əlaqəsizdir!');
}
let girishQadagandir ;
let yash = prompt ('Neçə yaşınız var?', '');
if (yash> 18) {
girishQadagandir = true;
} else {
girishQadagandir = false;
}
alert (girishQadagandir);
88
“?” operatoru “İf” operatorunun daha qısa və sadə yazılış şəklidir.
Operator sual işarə ilə təmsil olunur. “Tanery” olaraq adlandırılır, çünki operatorun
3 dəyəri vardır.
Sintaksisi:
Let netice = şert? deyer1: deyer2;
Şərt yoxlanılır: deyer1 düzdürsə deyer 1,əks halda isə deyer2 seçilir.
Məsələn:
let accessAllowed = (yaş> 18) ? true:false
Texniki olaraq > 18 ifadəsi mörtəziləri nəzərə almıya bilər. Sual işarəsi üstünlük
cəhətdən aşağıdır, bu səbəblə müqayisə sonra aparılır.
Bu nümunə əvvəlki nümunə ilə eyni nəticəni verəcəkdir:
Ancaq mörtərizələr kodu daha yaxşı oxumağa imkan verir. İstifadəsi məsləhətdir.
Yadda saxlayın:
//müqayisə operatoru üstünlüyə sahibdir. “yash>18”
// Mörtərizə içində yazmağa ehtiyac yoxdur
girishQadagandir = yash> 18? true false;
89
Yuxarıdakı nümunədə müqayisə işarəsi true/false dəyəri verdiyindən sual
işarəsində istifadə etmiyə bilərsiniz.
// eyni
let girishQadagandir = yash> 18;
Birdən çox şərt olduqda : ‘?’
Birdən çox şərt qoymaq üçün “?” operatorunda istifadə edə bilərsiniz.
Nümunə:
Anlamaqda çətinlik çəkə bilərsiniz. Ancaq daha aydın izah üçün bu hissəni diqqətli
oxuyun:
1. İlk sual işarəsi yash<3 olub, olmadığını yoxlayar.
2. Əgər doğrudursa “Salam Dünya” nəticəsini verəcəkdir. Əks təqdirdə 18 yaşını
yoxlayacaqdır “:”-əks halda davam etməsini bildirir.
let yash = prompt ('yash?', 18);
let cavab = (yash <3)? 'Salam Dünya!' :
(yash <18)? Salam!' :
(yash <100)? Sağol!' :
'Son!';
alert( cavab );
90
3. Bu düzdürsə, “Salam” dəyərini verəcəkdir. Əks halda <100 yaşını yoxlayacaqdır
“:” dan sonra ifadəsi davam edəcəkdir.
4. Əgər doğru olarsa “Sağol” ifadəsini verəcəkdir. Əks halda sonuncu nəticəni
döndürəcəkdir.
? yerinə if... else istifadə etsəydik:
‘?’-in istifadə edilmədiyi yerlər
Bəzən sual “?” işarəsi if-in əvəzinə istifadə edilir :
if (yash <3) {
cavab = 'Salam Dünya!';
} else if (yash <18) {
cavab = 'Salam';
} else if (yash <100
cavab = 'Sağol';
} else {
cavab = 'Son!';
}
let shirket = prompt ('Javascripti hansı şirkət yaratdı?', '');
(shirket == 'Netscape')?
alert ('Düzgün!'): alert ('Səhv.');
91
Şirkətlə bağlı olaraq == “Netscape”, ? ifadəsində birinci ifadə yoxlandıqdan sonra
ikinci ifadə yoxlanılacaqdır. Sonda isə alert işə düşəcəkdir.
Burda dəyişənə dəyər olaraq nəticəni vermirik. Sadəcə hala uyğun olaraq fərqli
kodların işləməsini istəyirik.
Sual işarəsini bu şəkildə ifadəsi məsləhət deyildir. Bu if ifadəsindən qısa olsada
oxunarlılığı heçdə yaxşı deyildir.
Müqayisə üçün sual yerinə if istifadə edək:
Gözlərimizlə kodu daha rahat oxumağa imkan verir. Anlaşılan şəkildə yazılışmış bu
kod tək sətirlik koddan daha rahatdır.
“?” operatorunu nə məqsədlə istifadə edirik? Nəticəyə uyğun olaraq dəyərin
verməsi üçün istifadə edilir.
let shirket = prompt ('Javascripti hansı şirkət yaratdı?', '');
if (shirket == 'Netscape') {
alert ( 'Düzgün!');
} else {
( 'Səhv.') ;
}
92
100>100>3>2015> Dostları ilə paylaş: |