# Javascript, Ecmascript
Javascript ilk olarak 1995 yılında Netscape browser’a eklenmiştir.
Client tabanlı bir object-oriented programlama dilidir. Ancak sunucu tarafında da javascript çalıştırılabilmektedir. Browser’ların yanı sıra başka uygulamalarda javascript’i kullanabilirler.
Livescript, javascript’in bir önceki adıdır. Mocha ‘da livescript’den önceki ismidir.
Ecma standartlar belirleyen içerisinde büyük ve orta ölçekli önemli firmalarında olduğu bir oluşum. Ecma-262 ‘de Ecma tarafından yayınlanmış bir standart dokümanı. Bu doküman ilk olarak 1997 yılında yayınlanmıştır. Bu yazıyı yazdığım tarihte 10. sürümü yayınlanmış gözüküyor.
Ecma-262 standart dokümana uyan scripting dillere ecmascript diller deniliyor. Ecmascript ise dil tanımlarını içeriyor, yani ecmascript bir programlama dili değildir. Ecma-262 çoğu zaman Ecmascript Standartı olarakta lanse ediliyor.
Javascript Mozilla tarafından 1.8.5 sürümüne kadar geliştirilmeye devam etmiştir. ES5 ‘e yakın sürümüdür de diyebiliriz.
Javascript’de şu anda kullanılan standart ECMAScript(ES) standartıdır.
ES5, 2009 sonrası çıkmış modern browser’larca full desteklenmektedir.
2015 yılında yapılan bir değişiklikle ES6 ile birlikte resmi olarak artık sürüm isimleri yıllarına göre çağrılmaktadır. ES6 aslında EcmaScript 2015 ‘dir.
Kullanmış olduğunuz browser’ın bir javascript engine’i bulunmaktadır. Bu engine hangi ES standartlarını desteklediği de ve bunların tamamını kapsayıp kapsamadığı da önemlidir. Çünkü kodu işletecek engine olduğundan desteklemesi de önemlidir.
Browser’lar sürümler güncellendikçe yeni EcmaScript standartlarını da engine’lerine eklemektedir.
# Operators
1 + 2
1-2
3 * 2
12 / 12
12 % 12
2**3
# Special Numbers
Infinity , -Infinity , NaN (Not a Number) değerleri normal sayılar gibi değildirler.
Infinity – 1 -> Infinity
-Infinity -> -Infinity
Infinity + 1 -> Infinity
Infinity / Infinity -> NaN
Infinity % Infinity -> NaN
0 / 0 -> NaN
# String Values
Tek tırnak, çift tırnak, “ şeklindeki tırnakla string tanımı yapılabilir.
“gokhan kesici”
‘gokhan kesici’
`gokhan kesici`
Escaping karakterleri de stringler içerisinde kullanabilirsiniz.
“gokhan \nkesici”
# String Operations
String’ler de bölme, çarpma veya çıkarma yapılamaz. Ancak toplama yani concatenate yapılabilir.
“gokhan”+”kesici” -> “gokhankesici”
“gokhan” – “kesici” -> NaN
“gokhan”*2 -> NaN
“gokhan”/”gokhan” -> NaN
# Variables in Strings
String içerisinde değişken kullanmak isterseniz “şeklinde string oluşturup ${degisken} şeklinde kullanabilirsiniz.
`4 bölü 2 eşittir ${4/2}`
`4 bölü 2 eşittir ${degisken1}`
# Unary operators
Sembollerle ifade edilmeyen keyword ‘lerle ifade edilen operatorlere denir.
typeof 2 -> number
typeof “gokhan” -> string
# Compression Operators, Boolean Values
2>1 -> true
2 >= 1 -> true
2<1 -> false
2 <= 1 false
2 == 2 -> true
NaN == NaN -> false
# Logical Operators
true && false -> false
true || false -> true
!true -> false
true ? 1:2 -> 1
false ? 1:2 -> 2
null || “gokhan” -> gokhan
“gokhan” || “kesici” –> gokhan
# Empty values
İki adet boş anlamında değer vardır. Biri null, diğer ise undefined.
undefined değeri tanımlanmamış anlamında iken, null ise değer boş olarak tanımlanmış demektir.
Bir değişken tanımı yapılıp bir değer atanmazsa bu otomatik olarak undefined’dır.
null obje tipindedir, undefined ise undefined tipindedir.
# Automatic Type Conversion
Javascript’de otomatik tip dönüşümleri otomatik de gerçekleşmektedir.
Örneğin bir string de çıkarma işlemi yapılamaz demiştik. Ancak otomatik tip dönüşümü olduysa yapılabilir.
8 * null –> null 0 gibi davranır.
“2” – 1 –> “2” sayı gibi davranır. Sonuç 1
“5” + 1 –> Sonuç 51. 1 değeri string gibi davranır.
false == 0 –> false 0 gibi davranır. Sonuç true.
null == undefined –> true döner.
null == 0 –> false döner tip dönüşümü yapılmaz.
# Scopes, Variables
Değişkenlerin görünürlüğünü kılan şeye scope denir.
JS’de iki çeşit scope vardır. Global ve local.
Fonksiyon içindeki değişkenler function(local) scope’dur. Ve fonksiyon dışından erişilemezler.
Fonksiyon dışında değişkenler global scope’dur. Her yerden erişilebilirler.
EsmaScript 2015 ile birlikte block scope adında yeni bir scope daha geldi. Block scope { } ‘u kapsar.
Değerleri tutmak için var, let, const kullanabiliriz.
var, EcmaScript 2015 öncesi de vardı ve var değişkeninin block scope’u bulunmaz. Yani { } bloğu içinde bir var değişkeni tanımlıysa buna blok dışından erişilebilir.
{ var marka = "mercedes";} console.log(marka); //mercedes
let, EcmasScript 2015 ile birlikte gelen bir keyword. let keywordü block scope’a sahiptir. Block dışından erişilemez.
{let marka = "mercedes";} console.log(marka); //erişilemez
Fonksiyon içerisinde let ve var function scope ‘dur. Fonksiyon dışından erişilemezler.
Dongü içerisinde block scope işler. blok içerisinde let li deklarasyona erişim sağlanamaz. var’a ise erişim sağlabilir.
var i = 2; for (let i=0; i<1; i++){ console.log(i); // 0 } console.log(i); // 2
Deklare edilmemiş atama işlemleri global scope’dur.
function f() {i = 2;} f(); console.log(i); //2
const, EcmaScript 2015 ile birlikte gelen bir keyword’dür. const’da let gibi block scope’dur.
const herhangi bir değer olmaksızın deklare edilemez. Örneğin aşağıdaki ifade yanlıştır.
const pi; pi=3.14;
const deklare edilirken bir değerle deklare edilmelidir.
const pi = 3.14;
const değişkenin refere ettiği primitive değer değiştirilemez. Aşağıdaki ifade hata döndürür.
const pi = 3.14; pi = 3.1415; // hata alırız
const değişkeni değeri bir dizi , obje ise, objenin özelliğindeki , dizinin eleman değerleri değiştirilebilir. const değişkeni tekrardan tanımlanamaz.
const araba = {marka:"mercedes"}; araba.marka = "bmw"; console.log(araba.marka); araba = {marka:"mercedes");
# Assigment Operators
let degisken1 = 100; degisken1 += 2; degisken1 -= 1; degisken1 /= 1; degisken1 *= 2; degisken1 % = 2; console.log(degisken1);
# Environment
Javascript kodunun çalıştığı ortamdır. Örneğin browser bir ortamdır. Browser ile erişebileceğimiz fonksiyonlar, değişkenler vs. tanımlıdır.
# Envoriment Functions Calling
Çalıştığımız ortama bağlı olarak tanımlı fonksiyonları aşağıdaki gibi çağırabilirsiniz.
prompt("Adiniz Soyadiniz");
# console.log()
Browser’da veya node.js’de farketmeksizin javascript çalıştıran konsola bir şey yazdırmanın yöntemidir.
Bilindiği üzere browser’larda genellikle developer tools altında console mevcuttur.
# if/else statement
let number = Number(prompt("Sayi giriniz")); if (!Number.isNaN(number)){ console.log("Sayinin karesi" + number * number ); } else {console.log("lutfen sayi giriniz")}
# while loop
let a = 0; while (a<3){ console.log(a); a = a+1; }
#do while loop
do while loop ‘un normal while loop’dan farkı en az bir kere çalışması.
let a = 0; do { console.log(a); } while (a > 1)
# for loops
for (let a=0; a < 3; a++){ console.log(a) }
# switch case
let num = prompt("Lütfen bir sayı giriniz"); switch (num) { case "1": console.log('kazandiniz'); break; default: console.log('tekrar deneyiniz'); break; }
# Comment
Javascript’de satır bazlı yorum satırı // ifadesinden sonra girilebilir./* */ arasına yazılan ifadeler ile de çok satırlı yorumlar yazılabilir.
/* Gokhan Kesici Example */ let sayi = 2; // ornek console.log(sayi)
# Functions
const karesi = function (x) { return x*x; } console.log(karesi(3));
Ya da
function karesi(x) { return x*x; } console.log(karesi(3));
# Arrow Functions
Yukarıdaki iki gösterim haricinde üçüncü bir fonksiyon tanımlama yöntemi daha mevcuttur. function kelimesinin yerine => ifadesini kullandığımızı düşünebilirsiniz.
const karesi = (x) => { return x*x;} console.log(karesi(3));
Ya da aşağıdaki gibi direkt aşağıdaki gibi de kullanabiliriz.
const karesi = x => x * x;
# Factory Functions
Bir fonksiyon içerisinde kullanılan başka bir fonksiyonunun return değer olarak verildiği fonksiyonlardır.
function f(a) { return b => b * a; } x = f(2); y= x(3) console.log(y);
# Binding
Her değişkenin bir scope’u vardır. Fonksiyon ve blokların dışındaki değişkenler global scope, fonksiyon ve bloklar içindekiler local scope’dur.
let ve const ifadeleri bloklar içerisinde local ‘dir. var ise blok sonrasında da kalıcılığına devam eder.
let x = 1; if (true){ let a = 2; var b = 3; const c = 4; console.log(x+a+b+c); //çalışır. } console.log(x+b); // çalışır console.log(x+a); // hata alır console.log(x+c); // hata alır
# List Data Type
let mylist = [1,2,3]; console.log(mylist.length); console.log(mylist[2-1]);
# Object Value
Objelere obje.ozellik seklinde ulaşabiliriz. Ya da obje[“ozellik”] seklinde ulasabiliriz. Obje içerisindeki bir key/value çiftini silebilir, yeni bir key/value çiftini ekleyebiliriz.
let araba = { marka : "BMW", model : "5.20", renk : "beyaz", isim : function () { return this.marka + " " + this.model; } }; console.log(araba.marka); // ozellige erisim console.log(araba["model"]); //ozellige erisim console.log(araba.isim()); // behavior/metot erisimi delete araba.renk; // ozellik silme araba.yil = "2015" // yeni ozellik console.log(araba); Object.assign(araba,{model:"3.20", motor:"2.0"}); // yeni özellik ve güncelleme console.log(araba); console.log(Object.keys(araba)); // sadece key'ler console.log(Object.values(araba)); // sadece value'ler
Mutability
Sayilar, stringler, boolean değerleri immutable yani değiştirilemezler.
Objeler, listeler mutable tiplerdir.
# Array Loops
let myarray = [1,2,3,4] for (let i = 0; i < myarray.length; i++) { let num = myarray[i]; console.log(num); }
Yukarıdaki döngüyü aşağıdaki gibi de yazabilirdik.
let myarray = [1,2,3,4] for (let num of myarray) { console.log(num); }
# Any Number Arguments
Fonksiyonların alabileceği argüman sayısını kısıtlamadan … ile çok fazla argüman almasını sağlayabiliriz.
function max(...sayilar){ let sonuc = -Infinity; for(let sayi of sayilar){ if(sayi > sonuc) sonuc= sayi; } return sonuc; } console.log(max(4,2,3,5,21,31,13,17));
… ‘yı include işlemi içinde kullanabiliriz.
let a = [1,2,3]; console.log([...a,4,5]);
# JSON
Json veri depolamak ve transferi için en çok tercih edilen formatlardan biri. Kendince kuralları mevcut. Bildiğimiz javascript’deki object’den biraz farklı.
Örneğin object’de key çift tırnaksızken json’da key değeri çift tırnak ile belirtilmeli. Mesela object’de metot kullanılabilir ken , json’da metot kullanılmaz. Dönüştürmek için bazı araçlara ihtiyaç duyabiliriz.
Javascript ‘de json formatına dönüştürmek için JSON.stringify , parse etmek için ise JSON.parse kullanabiliriz.
let araba = { marka : "mercedes", model : "a180", renk : "kırmızı" //metal kırmızısı }; araba = JSON.stringify(araba); console.log(araba); console.log((JSON.parse(araba)['marka']));
# Class
Class, Ecmascript 2015 ile gelen bir keyword. Class’lar ile object tipinde yeni instance’lar oluşturabiliriz. Instance oluştururken new keyword ile ilgili class çağrılmalıdır.
class araba { constructor(marka) { this.marka = marka; } goster() { console.log(this.marka); } } a = new araba('Mercedes'); // yeni bir instance a.goster();
Yukarıdaki örnekte fark etti iseniz goster metotu için function ifadesini kullanmadık. Class keyword’u ile bir class oluşturulduğunda function ifadesini kullanmayız.
constructor fonksiyonu ise obje oluşturulmak istediğinde otomatik çağrılan init fonksiyonumuz. Her object oriented dilde bu tarz yapılar mevcut.
this ifadesi ise instance’in kendisi anlamına gelmektedir. Instance dışında biri tarafından ilgili özelliğe erişilemez. Python’daki self gibi düşünebilirsiniz.
İlgili goster metotu sadece içeriden çağrılsın, obje tarafından çağrılmasın istiyorsanız ki bu da mümkün yanına static ifadesini getirmelisiniz. Class’ı direkt çağırabilirsiniz.
class araba { constructor(marka) { this.marka = marka; } static goster(x) { console.log(x.marka); } } var a = new araba('Mercedes'); araba.goster(a); // calisir a.goster(); //calismaz, hata alirsiniz.
# new
Yeni bir obje oluşturmak için kullanılır. Örneğin aşağıdaki iki şey farklıdır.
var a = "gokhan"; var b = new String("gokhan");
a değişkeni string tipindedir, b ise bir obje tipindedir. Obje bildiğiniz üzere yeni properties’ler alabilirler. Yani gidip b.soyad = “kesici” şeklinde bir tanım yapılabilir.
# Prototype
Javascript’e objelere yeni property’leri eklenmesi için ve sonrasında diğer objelerinde bunu kullanmasını istiyorsak prototype kullanabiliriz. Ayrıca javascript enginler oluşturulan bu property ve metotları prototype ‘a bakarak bulurlar.
function f() { var a = 1; this.b = 2; } f.prototype.c = 3; var i = new f(); var ii = new f(); console.log(i.a); //undefined console.log(i.b); // 2 console.log(i.c); // 3 console.log(ii.c); //3 console.log(f.prototype)
Her fonskiyon prototype objesine sahiptir. Fonksiyon’dan üretilen obje,instance’da __proto__ adlı bir attribute’e sahiptir. Bu attribute’de fonksiyonun prototype’ını işaret eder.
console.log(typeof f.prototype); //object console.log(typeof i.prototype); //undefined console.log(typeof i.__proto__); //object
Objelerin prototype’ına erişmek __proto__ yerine Object.getPrototypeOf(obj) kullanırız.
console.log(typeof Object.getPrototypeOf(i)); //object
# Inheritance, extends, super()
Başka bir class’dan miras almak için yani onun özelliklerini kendi classına dahil etmek , superclass oluşturmak için extends keywordünü kullanabiliriz.
class A { b = 10; } class B extends A { c = 15; } var a = new B(); console.log(a.b + a.c)
Aşağıdaki örnekte ise B class’ı oluşturulduğunda A classı inherent edilecektir. super() burada önemlidir. Çünkü super() metodu ile a değerine erişebilirdik. Aksi durumda B’nin constructor’ı A’yı override edeceğinden a ‘ya erişemeyecektik.
class A { constructor() { this.a = 10; } } class B extends A { constructor() { super(); this.b = 15; } goster(){ console.log(this.a + this.b); } } var test = new B(); test.goster();
# Getter / Setter
Obje tipindeki değişkenlerin değerlerini kontrollü bir şekilde çekmek ve yazmak için get/set keywordü ile tanımlı fonksiyonları kullanmak en güzel yöntemlerden biridir.
class araba { constructor(marka){ this.marka = marka; } get model(){ return this.marka; } set model(x){ this.marka = x; } } a = new araba('mercedes'); console.log(a.marka); //get a.model="bmw"; //set console.log(a.marka); //get
# Strict Mode
ES5 ile birlikte gelen bir özelliktir. use strict direktifi kullanılır. Kodun strict mode da çalışmasını sağlar.
Strict mode şunu yapar. Örneğin var, let, const gibi ifadeler kullanmadan bir değişken tanımladık. Bu değişken global scope olur. Deklare olmadığında hata fırlatmasını istiyorsak strict mode aktif edilir.
"use strict"; a = 2; console.log(a); // hata alır.
Bunun yanı sıra bir değişkenin, fonksiyonun silinmesini , duplice paramtreler kullanılmasını, read-only property yazılmasına, get only property yazılmasına, silinmemesi gereken property’lerin silinmesi vs. gibi bir çok diğer kısıtlandırmaları da beraberinde getirir.
# Regex
Regex bir çok dilde kullanılan önemli bir araçtır ve string pattern’ler belirleyip bu patternleri text içerisinde bulmamıza yarar. pattern’imizi // şeklinde belirleyip regex kabul eden fonksiyonlarda kullanabiliriz.
var mypattern = /gokhan/gi; var cumle = "Merhaba ben Gokhan Kesici, gokhan Kesici"; var ara = cumle.search(mypattern); var esles = cumle.matchAll(mypattern); var testet = mypattern.test(cumle); var bul = mypattern.exec(cumle); console.log(ara); //12 console.log(testet); //true console.log(bul[0]); //Gokhan console.log(esles.next().value[0]); //Gokhan console.log(esles.next().value[0]); //gokhan
# Hoisting
Bir çok dilde değişkenler, fonksiyonlar yukarıdan aşağıya doğru okunan kod yaklaşımındada önce deklare edilir sonra kullanılır. Ancak javascript’de böyle bir zorunluluk yoktur. Buna yaklaşıma hoisting denir.
Örneğin aşağıdaki kod uygun bir koddur.
x=5; f(); function f() { console.log("Hoisting works.") } var x; console.log(x);
Ancak aşağıdaki kod uygun bir kod değildir. Çünkü y deklare edilip bir değer ataması yapılmıştır.
x=3; console.log(x+y); //NaN var x; var y=2;
# Function Closure
Bir teknik bir yaklaşımdır. Değişkenlerinizin , fonksiyonlarınızın durumunu korumak için kullanılır. İç içe fonksiyonlar kullanarak gerçekleştirebiliriz.
function Outer() { var i = 0; function Inner() { return i +=1; }; return Inner; } var counter = Outer(); console.log(counter()); console.log(counter()); console.log(counter());
# Modules
Javascript başta modüler değildi sonrasında modüler yapıyı sağlayan framework ve kütüphaneler çıktı. Ancak native olarak EcmaScript 2015 ile birlikte modüller geldi.
Bu yazıyı yazdığım tarih itibariyle popüler modern tarayıcılar EcmaScript 2015 modüllerini destekliyor. Malesef IE desteklemiyor.
Modül kullanımı için iki temel keywordümüz bulunuyor. Biri import diğeri export.
export ifadesini hangi değişken, sınıf, fonksiyonların dışarıya sunulacağını belirlemek için kullanırız.
import ifadesini de nelerin içeriye dahil edileceği belirlemek için kullanırız.
//variables.js var a = 2; // export edilmis var b = 3; // export edilmemis, erisilemez var c= function () { console.log("module1"); }; // export edilmis export {a,c}
//main.js import {a,c} from './variables.js'; console.log(a); c();
Yukarıdaki örnekte variables.js diye bir dosyamız ve içerisinde değişkenleri tanımladık. Sonrasında bunların main.js’mize import edip kullandık.
Şimdi browser’ımızda destekliyorsa main.js ‘mizi çalıştıracaktır. Type olarak module girmeyi unutmayalım yeter.
<script type="module" src="./main.js"></script>
Tabi bu daha yaygınlaşmış bir özellik değil. Module kullanma ihtiyacınız olursa RequireJS gibi diğer araçları da kullanabilirsiniz.
# HTML DOM
Browser’lar Bir web sayfası yüklendiğinde html parse edilip sayfanın bir modeli oluşturur. Buna HTML Document Object Model (DOM) denir.
HTML DOM , html elementleri, özellikleri, metotları veya eventleri demektir.
Javascript, HTML DOM’a erişip sayfa yapısını , içeriğini değiştirebilir, yeni şeyler ekleyebilir, silebilir.
Örneğin test id ‘li element’in içeriğini değiştirelim.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p id="test">Merhaba</p> <script> document.getElementById("test").innerHTML = "Merhaba Dunya"; </script> </body> </html>
# Browser Object Model (BOM)
Browser objelerine de javascript ile erişebiliriz. Onları yönetebiliriz.
Örneğin sayfanın yüklendiği pencerede alert oluşturalım.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> window.alert("Hosgeldiniz"); </script> </body> </html>
# Node.js , npm
Javascript ilk brwoser’lara gelmişti. JS dosyamız client’ın browser’ında çalışıyordu.
Node.js ile birlikte js ‘ler sunucu ortamında çalıştırılıp içerik kullanıcıya sunulabilir.
Node.js asenkron programlama mantığı ile çalışır. Bu sebeple bir istek bitmeden diğer istek gelebilir ve bu istekte karşılanır.
Node.js yükleyip yukarıda örneklerde verdiğimiz örnekleri js dosyalarını direkt çalıştırabilirsiniz.
Node.js ‘de moduler yapıyı desteklemektedir. JS dosyaları modüler olarak oluşturulabilir.
Node.js ile birlikte bir çok built-in module de gelir. Bunun yanı sıra başkalarının yazdığı modulleri de kullanabilirsiniz.
Npm bir paket yöneticisidir. Javascript paketlerini indirip projenizde kullanabilirsiniz.
# Ajax
Bir web sayfasını tekrar yüklemeden sunucuya tekrar tekrar istekler yapmak ve sunucudan gelen yanıtı içeride işletmek için kullanırız.
Ajax bunu nasıl sağlar. Ajax bunu browser’larda XMLHttpRequest diye bir api var. Bu api ye erişip sunucuya istekler gönderebiliyoruz.
Örneğin Google Chrome’da Developer Tools / Network’den XHR altında Ajax istekleri görülebilir.
<!DOCTYPE html> <html> <body> <div id="test"> <button type="button" onclick="loadDoc()">Icerik degis</button> </div> <script> function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("test").innerHTML = this.responseText; } }; xhttp.open("GET", "test.html", true); xhttp.send(); } </script> </body> </html>
# HTML events
HTML elementlerinde browser’da sayfada bir tıklama, yüklenme, mouse hareketi gibi bir hareket/olay yaşandığında bir javascript kodu çalıştırabilir, çeşitli aksiyonlar aldırabiliriz.
Örneğin aşağıdaki butona tıklandığında loadDoc() fonksiyonu çalışacaktır.
<button type=”button” onclick=”loadDoc()”>Icerik degis</button>
# Jquery
Jquery bir javascript kütüphanesi ve özellikle javascript’de çok güzel animasyonlar yapabileceğiniz kullanımı basit olduğundan çok popüler.
Javascript’de yazabileceğiniz kodları çok daha basit halleriyle yazabilirsiniz.
# React
React, Facebook tarafından geliştirilmiş javascript kütüphanesidir.
Bir MVC framework değildir. React’in odaklandığı konu View’dir.