JavaScript Kopya Kağıdı

by Ismail Sirma


Posted on 31.5.2020 09:42:01


Bu yazıda javascript öğrenmeye başlayanlar için temel faydalı bilgileri bir araya getirmeye çalıştım.

Javascript’te bir method un tüm parametrelerini girerek fonksiyonu çağırmak zorunda değiliz.

Eklemediğimiz parametreler undefined değerini alır. Bundan dolayı aynı isimde farklı parametrelere sahip fonksiyonlar oluşturamıyoruz.

Parametrelerin data türünü belirlemek zorunda değiliz. (Dynamically typed)

Polymorphism

Aynı fonksiyon ismi ile farklı parametre seçeneklerinde methodlar oluşturmak ve dilin bu methodları verilen inputlara göre ayırıp doğru methodu çağırması. Javascript’te bu özellik bulunmuyor. Eğer aynı isimde iki fonksiyon varsa ikincisi ilkinin yerini alır.

 

Default parameters

foksiyona değer verilmez ise varsayılan değer atanabilir :

Function myFunc(name, weather = “raining”) {}

 

Rest Parameters

ek argumanları yakalayabilmek için kullanılır.

Function myFunc(name, weather, ...extraArgs) {
     for (let i = 0; i < extraArgs.length; i++) {
	console.log(“Extra arg : “ + extraArgs[i]);
    }
}

myFunc(“Adam”, “sunny”, “one”, “two”, “three”);

Rest parametresi isminin başına 3 nokta alır. extraArgs array tipindedir.

 

RETURN keyword

Fonksiyonların bir sonuç dönemsi için kullanılır. Fonksiyonu çağırıp sonucunu başka bir fonksiyon içinde de kullanabilirsin. Zincirleme olarak fonksiyon çağırımı yapılabilir.

Fonsiyonun ismiyle başka bir Fonksiyon içinde input olarak kullanılması

function myFunc(nameFunction) {
	Return (“Hellp” + nameFunction() + “.”);
}
function printName(nameFunction, printFunction){
	printFunction(myFunc(nameFunction));
}
printName(function() { return “Adam” }, console.log);

Arrow Fonksiyonları

Bir diğer adı fat arrow veya lambda expression olan bu isimlendirme fonkisyon tanımlamanın alternatif bir yöntemi olarak bir başka fonksiyona sadece arguman olarak sunulan fonksiyonlar için kullanılır. Return keyword’ü ve parantezler yalnızca birden fazla ifade hesaplanacak ise gerekir.

const myFunc = (nameFunction) => (“Hello “ + nameFunction() + “.”);
const printName = (nameFunction, printFunction) => 
				printFunction(myFunc(nameFunction));

printName(function() { return “Adam” }, console.log);

let : Değişken tanımlamak için kullanılır. Var gibidir.

Const : Tek seferde tanımlanan ve sabit değişmeyen değerlerde kullanılır.

Var : Değişkenin kapsamı bulunduğu fonksiyonun içidir. Bu karışıklığa sebep olabilmektedir. Bunun yerine let kullanılabilir.

 

Bir kenar notu olarak, ESLint paketi javascript kurallarını kontrol ederek değişken scope’u ile ilgili uyarılar verir. React geliştirme araçlarında ESLint kullanılıyor.

 

İç fonksiyon dışındaki (içine alan) fonksiyonun değişkenlerine erişebilir. Bu sayede içeri değişken atman gerekmez. Fakat değişken isimleri yaygın kullanılan isimlerle karıştırılmamalı (index, counter gibi)

function myFunc(name) {
	let myLocalVar = “sunny”;
	let innerFunction = function () {
		return (“hello” + name + “. Today is “ + myLocalVar + “.”);
	}
        return innerFunction();
}

Primitive Types

Javascript primitive türleri : string, number, boolean, undefined, null, Symbol

Undefined

Tanımlanmış fakat değer atanmamış

Null

Değişkenin hiçbir değeri olmadığında kullanılır.

Symbol

Sabit, değişmez (immutable) değer, unique ID yi ifade eder.

String Methodları

String ister ‘’ veya “ “ ile kullanılabilir.

 

İsim

Açıklama

length

Karakter sayısı

chatAt(index)

Belirli konumdaki stringi döner

concat(string)

Üzerinde çağırıldığı string ile input olarak verilen stringi birleştirip döner.

indexOf(term, start)

Term ifadesinin string içerisindeki ilk bulunduğu konumu döner. Eğer bulamazsa -1 olarak sonuç döner. START parametresi opsiyoneldir. Başlangıç konumunu içindir.

Replace(term, newTerm)

Bu method tüm term diye geçen stringi newTerm ile değiştirerek yeni bir string döner.

Slice(start,end)

Bu method stringi term ile ayırarak string array i döner. Örneğin virgülle ayırmak gb

toUpperCase()

Tüm karakterleri büyütür.

Trim()

Başta veya sonda boşluk yada whitespace varsa siler.

 

Template Strings

function messageFunction(weather) {
	let message = ‘It is ${weather} today’; 
        console.log(message);
}

Rakamlar hexadecimal 0xFFFF;  gibi tanımlanabiliyor.

Equality Operator vs Identity Operator

Equality operatörü == türden bağımsız değerleri karşılaştırır.

Identity operatörü === ise hem tür hem değerin eşitliğini karşılaştırmada kullanılır.

 

Javascript + operatörü string ile rakam toplamında rakamı da stringe dönüştürür.

Rakamları String’e çevirme

(5).toString()    veya toString(10)    veya  toFixed(n)   n: digit sayısı kadar rakama çevir.

toPrecision(n)    

Stringi rakama çevirme

Number(“5”) : Integer yada gerçek değer oluşturur

parseInt(str)  : Integer değeri oluşturur

parseFloat(str) : Integer veya gerçek değer oluşturur

Array’ler

let myArray = new Array();
myArray[0] = 100;      
myArray[1] = “Adam”;    
myArray[2] = true;

Array büyüklüğünü belirlemek gerekmiyor. JS otomatik yeniden arryi boyutlandırıyor. Array tek tür veri tutmuyor.

let myArray = [ 100, “Adam”, true ];
myArray[0]  = “Tuesday”

Array’in öğelerini birer birer kontrol etmek

for(let i = 0; i < myArray.length ; i++) {
	console.log(‘Index ${i} : ${myArray[i] } ’ );
}
myArray.forEach(    (value, index) => console.log(‘Index  ${index} : ${value } ’ )      );

for veya foreach kullanılarak array elemanları üzerinden gidilebilir.

 

Spread Operatörü

... ile gösterilir. Array içindeki mevcut tüm değerleri çağırmak için kullanılır.

printItems(...myArray);

arrayleri birbirine birleştirmede (concatenate) de işe yarıyor.

let myArray = [ 100, “A	dam”, true];
let myOtherArray = [ 200, “Bob”, false, ...myArray ];

Array Methodları

 

Array nesnesine ait methodlar:

İsim

Açıklama

concat(otherArrray)

İki arrayi birleştirir, birden fazla array eklenebilir.

join(seperator)

Array’in tüm elemanlarının birleşip string oluşturmasını sağlar. Ayraç karakteri ile tüm elemanlar birleştirilir ve bir string döner.

pop()

Array içindeki son elemanı siler ve sonuç olarak döner.

shift()

Array içindeki ilk elemanı siler ve sonuç olarak döner.

push(item)

Array in en sonuna input olarak verilen elemanı ekler.

unshift(item)

Array in en başına yeni bir eleman ekler.

reverse()

Tüm elemanları ters sıra ile yeni bir array döner.

slice(index, count)

Array’in bir bölümünü sonuç olarak döner.

sort()

Array in sıralanmasında kullanılır. Ek bir fonksiyon ile özel karşılaştırmada yapılabilir.

splice(index, count)

Count sayısı kadar elemanı index pozisyonundan başlayarak siler. Silinen elemanlar sonuç olarak dönülür.

every(test)

Bu method input olarak verilen test fonksiyonunu array içindeki tüm elemanlar için çalıştırır. Tümünde koşul sağlanırsa true, eğer bir tanesinden bile sonuç true değilse ise sonuç olarak false dönülür.

some(test)

Bu method test fonkisyonu için en azından bir elemanda true sonucu verirse sonuç olarak true dönülür.

filter(test)

Input olan test fonksiyonu için true sonuç dönen array elemanlarını sonuç olarak döndürür.

find(test)

Input olan test fonksiyonu için true dönen ilk array elemanını sonuç olarak döndürür.

findIndex(test)

Input olan test fonksiyonu için true dönen ilk array elemanının adresini (sırasını) sonuç olarak döndürür.

forEach(callback)

Array içindeki her öğe için callback fonksiyonunu çağırır.

includes(value)

Eğer array value değerini içeriyorsa sonuç olarak true döndürür.

map(callback)

Bu fonksiyon array içindeki tüm öğeler için callback fonksiyonunu çağırır ve her öğe için oluşan sonucu yeni bir array’de toplayarak output döndürür.

reduce(callback)

Callback fonksiyonunu akümüle (oluşan sonuç tüm öğelerde hesaplanıp biriktirilerek hesaplanan tek değer) değeri döndürür.

let products = [ 
                 { name : “Hat”, price : 24.5, stock : 10 },  
                 { name : “Kayak”, price : 289.9, stock : 1 } 
];

let totalValue = products.filter(item => item.stock > 0)
			.reduce( 
                                 (prev, item) => prev + (item.price * item.stock), 0);

JS’de Nesneler

let myDate = new Object();   // obje oluşturma
myData.name = “Erdem”;       // obje’ye özellik tanımlama
myData.weather = “sunny”;

Object Literal Format

let myData = {
	Name : “Erdem”,
	Weather : “sunny”
};

Değişkeni Property olarak kullanmak

let name = “Ismail”
let myData = {
	  name,
          weather : “sunny”
};

Fonksiyonları method gibi Kullanmak

Objelere fonksiyon ekleyebilirsin. Nesnenin içine eklenen fonksiyon method olarak isimlendirilir.

let myData = {
	Name : “Ismail”,
	Weather : “sunny”,
	printMessages:  function () {
		console.log(‘Hello ${myData.name}.’);
		console.log(‘Today is ${myData.weather}.’);
	}
};

myData.printMessages();

fonksiyonu nesne içinde şu yöntemler ile de tanımlayabilirsin:

printMessages() { }   

printMessages : () => { }

 

Nesnelerin Kullanımı

class MyData {
	constructor() {
		this.name = “Adam”;
		this.weather = “sunny”;
	}
	printMessages = () => {
		console.log(‘Hello ${this.name}.’);
	}
}

let myData = new MyData();

Constructor nesne yaratıldığında otomatik olarak çağırılır. This keyword’ü ile mevcut üzerinde bulunulan nesneye erişilmiş olur.

React geliştirilmesinde direk olarak inheritence kullanılmamakla birlikte, composition yöntemi ile kalıtım sağlanır.

 

Bir nesneden diğerine property’lerin kopyalanması

Object.assign(nesne, kopyalanacakOlanNesne)

Bu method ile input olarak girilen ilk nesne içerisine ikinci input nesnesinin property değerleri kopyalanır.

Bir diğer yöntemde spread operatörünü kullanmak:

let myData = new MyData();
let secondObject = { ...myData,weather: “cloudy” };

Nesne içinde Parametre değerlerini kullanmak

const myData = {
	name : “Erdem”,
	location : {
		city: “London”,
		country: “United Kingdom”
	},
	employment: {
		title : “Manager”,
		dept : “IT”
	}
}
// 1inci yol
function printDetails( data )
{
	console.log(‘Name : ${data.name}, City: ${data.location.city}, 
        Role: ${data.employment.title}’);
}

// 2inci yol
function printDetails( {name, location : { city } , employment : { title} })
{
	console.log(‘Name : ${name}, City: ${city}, Role: ${title}’);
}

JavaScript Modul’leri

Uygulamanın daha yönetilebilir parçalarda olması için modül’ler kullanılabilir. JS uygulamasının gereksinim duyduğu kod parçalarını içerir.

 

JavaScript’te Modül Oluşturmak ve Kullanımı

src klasörü altına aşağıdaki sum.js dosyasını ekleyelim:

export default function(values) {
	return values.reduce( total, val) => total + val, 0);
}

Yukarıdaki kod ile bir modül oluşturmuş olduk. Export keywordü modül dışında da erişilebilir olmasını sağlıyor. Bu sayede uygulamanın diğer kısımlarında kullanılabilir.

Default keyword’ü ise modül tek bir özellik (örneğin fonksiyon) içerdiğinde kullanılır.

 

JavaScript’te Modül Kullanımı

Örnek bir dosya içerisinde önce modül import edilir, daha sonrasında fonksiyon çağırılarak kullanılır.

import additionFunction from “./sum”;

let values = [ 10, 20, 30, 40, 50};

let total = additionFunction(values);

import keyword’ü ile gereksinim tanımı yapılır. İmport’tan sonra identifier yani fonksiyon adı getirilir.

En son modul’ün bulunduğu dosya adresi eklenir. Build sürecinde react tool’ları import kelimesini yakalayıpi sum.js dosyasını dahil eder ve tarayıcıya gönderir. Dosya adresinde uzantı bulunmaz.

Eğer fonksiyon ismi kullanılmadan import yapılırsa, node_modules klasörü altındaki gereksinimlerin (paketler) projede kullanılmasına imkan verir.

import React, { Component } from “react”;

React modülü içinde, node_modules klasörü altında ana react uygulama özelliklerine bu paket ile erişilir.

Modül’deki Özellikleri Çıkarıp Kullanmak

Modül özelliklerine isim ataması yapılabilir. Örneğin export edilen sum modülüne bakalım:

export function sumValues(values) {
	return values.reduce( (total, val) => total + val, 0 );
}

Fonksiyon aynı özelliği sağlıyor fakat default keyword’ünü kullanmıyor. Şimdi bu özelliği kullanalım:

import { sumValues } from “./sum”;

let values = [ 10, 20, 30, 40, 50];
let total = sumValues(values);

eklenecek olan özellik köşeli paratez ile belirtilir. Modül isimlendirilmiş ve default özellikleri aşağıdaki gibi export edebilir:

export function sumValues (values) {
	return values.reduce( (total, val) => total + val, 0);
}

export default function sumOdd(values) {
	return sumValues(values.filter( (item, index) => index % 2 === 0) );
}

Export edilen özellikleri kullanalım:

import oddOnly, { sumValues } from “./sum”;

let values = [ 10, 20, 30, 40, 50];
let total = sumValues(values);
let odds = oddOnly(values);

Modül içinde birden fazla fonkisyon veya değer içerebilir. Default kullanımı zorunlu değil. Default olmayan özellikler {} içinde virgül ile ayrılarak import edilir.

import { multiply, subtract } from “./operations”;     // operations.js dosyasından

Modül isimlerini değiştirmek

Kullanacağımız modülü farklı bir isimle kullanıp ile daha okunabilir bir kod elde edebiliriz.

import { multiply, subtract as deduct } from “./operations”;

console.log(‘Subtract: ${ deduct(1000, values) }’);

Tüm modülü dahil etmek

import * as ops from “./operations”;

JavaScript Promise

Promise arka planda çalışıp, çalıştırıldığı andan sonra ileride belirli bir zamanda tamamlanacak olan aktivitedir. Promise’ler örneğin HTTP isteği göndermede kullanılabilir. Asenkron bir biçimde, sunucudan cevap geldiğinde sonuç üretebilir.

Bir örnek ile kodun asenkron çalışmaması durumunda ne ile karşılacağımızı görelim.

import { sumValues } from “./sum”;

export function asyncAdd(values) {
	setTimeout( () => {
		let total = sumValues(values);
		console.log(‘Async Total : ${ total }’);
		return total;
	}, 500);
}

setTimeout fonkisyonu asenkron olarak bir fonksiyonu delay ( uzatma) süresi (milisaniye) sonunda çağırır. Böylece arka plandaki iş hemen çalıştırılmamış olur.

import { asyncAdd } from “./async”;

let values = [10, 20, 30, 40, 50];
let total = asyncAdd(values);
console.log(‘Main Total: ${total}’);

Kodu çalıştırdığımızda sonuç olarak aşağıdakileri elde ederiz. Kullandığımız asyncAdd fonkisyonu en son kısımda yer alan log mesajı çalıştırılmadan önce asenkron method ‘un işi tamamlanmadığından dolayı undefined sonucunu verir.

               Main Total: undefined

               Async Total: 150

JavaScript Promise Kullanımı

Asenkron bir görev olduğunda onun bitmesini bekleyip sonucu ondan sonra gösterimini sağlayacağımız durumda Promise kullanabiliriz.

Promise oluşturulurken new keyword’ünü kullanırız. Promise içinde izlenecek olan fonksiyonu kabul eder. İncelenecek olan fonksiyonda asenkron iş bitiminde görevin arguman sonucunu kabul eden ve geri çağıran callback mekanizması bulunur. Callback çağırılması sözün çözümlenmesidir (resolving promise).

then fonksiyonu içinde callback kullanıldıktan sonra çağırılacak fonksiyon tanımlanır.

import { sumValues } from “./sum”;

export function asyncAdd(values) {
	return new Promise(callback =>
	setTimeout( () => {
		let total = sumValues(values);
		console.log(‘Async Total : ${ total }’);
		return total;
		callback(total);
	}, 500);
}


import { async } from “./async”;
let values = [10, 20, 30, 40, 50];

asyncAdd(values).then(total => console.log(‘Main Total: ${total}’) );

JavaScript’te Basitleştirilmiş Asenkron

Async ve await keyword’leri ile promise kullanmadan asenkron işlemler gerçekleştirilebilir. Bu keyword’leri kullandığımızda then methodunu kullanmamız da gerekmeyecek.

import { async } from “./async”;

let values = [10, 20, 30, 40, 50];

async function doTask() {
	let total = await asyncAdd(values);
	console.log(‘Main Total: ${ total }’);
}

Bu keyword’ler sadece fonksyionlara uygulanabilir. Async keyword’ü bu fonksiyonun çalışması promise gerektirdiğini gösterir. Await keyword’ü ile çağırılan fonksiyon bir promise dönmesini ve await ile değişkene dönülen sonucun etkisiyle promise nesnesinin callback sonucu etkilenir.

Blog Search

Message

Welcome to Blog of Ismail Sirma.

Back to List