JavaScript’te “forEach()” Metodu Kullanımı
JavaScript’te “forEach()” metodu, dizi (array) üzerinde döngü oluşturmak için kullanılır ve dizinin her bir elemanı üzerinde belirtilen işlevi gerçekleştirir.
JavaScript’te “forEach()” Metodu
Diziler (array) üzerinde işlem yapmak için kullanılan metodumuz, ismini “her biri için” anlamına gelen “for each” ifadesinden alır ve bir dizi üzerindeki her bir öğeye belirli bir işlemi uygulamak için kullanılır. Söz dizimi (syntax) ise aşağıdaki gibidir:
array.forEach(function(currentValue, index, arr) {
// işlemler burada yapılır
}, thisValue);
function(currentValue, index, arr)
: Bu bir callback fonksiyonudur ve üç parametre alır:currentValue
: (Zorunlu) Geçerli elemanın değeri.index
: (Opsiyonel) Geçerli elemanın dizin değeri.arr
: (Opsiyonel)filter()
metodunun çağrıldığı dizi.
thisValue
: (Opsiyonel) Geri çağırma fonksiyonu (callback function) içerisinde kullanılacak olan this değerini belirtir.
let obj = {
value: 5,
multiply: function(arr) {
arr.forEach(function(item, index, array) {
array[index] = item * this.value;
}, this); // 'this' burada 'obj' objesine referans verir
}
};
let numbers = [1, 2, 3];
obj.multiply(numbers);
console.log(numbers); // [5, 10, 15]
Söz diziminde gösterilen thisValue
ise opsiyonel bir parametredir. Bu parametre, geri çağırma işlevi içinde this
olarak kullanılmak üzere bir değeri belirtir. Eğer bu parametre belirtilmezse, this değeri undefined
olacaktır. İkinci parametreyi kullanarak this
değerini belirtme özelliği, özellikle bir nesne metodunda forEach
‘i kullanırken yararlı olabilir. Ancak bu özellik, pek kullanılmadığı gibi çoğu durumda gerekli olmaz. Aşağıdaki örneği inceleyiniz:
let cities = ["İstanbul", "Ankara", "İzmir"];
cities.forEach(function(city, index, arr) {
console.log(`Şehir ${index + 1}/${arr.length}: ${city}`);
});
// Çıktı:
// Şehir 1/3: İstanbul
// Şehir 2/3: Ankara
// Şehir 3/3: İzmir
Bu parametrelerin tamamını kullanmak zorunda değiliz. Eğer yalnızca mevcut değere ihtiyacınız varsa, currentValue
parametresini kullanmak yeterli olacaktır. Örneğin:
let fruits = ['elma', 'muz', 'kiraz'];
fruits.forEach(function(fruit) {
console.log("Meyve: " + fruit);
});
Yukarıdaki örnekte, her bir meyveyi konsola yazdırmak için yalnızca currentValue
parametresini (bu örnekte fruit
olarak adlandırılmıştır) kullandık.
“Arrow” Fonksiyonu ile “forEach” Metodu
JavaScript’te “arrow” fonksiyonu ile “forEach” metodumuzun söz dizimi aşağıdaki gibi olur:
array.forEach((currentValue, index, arr) => {
// işlemler burada yapılır
});
Aşağıdaki örneği inceleyiniz:
let cities = ["İstanbul", "Ankara", "İzmir"];
cities.forEach((city, index, arr) => {
console.log(`Şehir ${index + 1}/${arr.length}: ${city}`);
});
// Çıktı:
// Şehir 1/3: İstanbul
// Şehir 2/3: Ankara
// Şehir 3/3: İzmir
Arrow fonksiyonu (=>
), normal fonksiyon sözdiziminin yerine geçer ve daha özlü bir yapı sağlar. Örnekte de görebileceğiniz gibi, function
anahtar kelimesi yerine doğrudan parametreleri parantez içinde belirtip arrow işaretiyle fonksiyon gövdesine geçiş yapabilirsiniz.
JavaScript’te, normal fonksiyonlar dinamik bir this
değeriyle çalışır. Bu durum, forEach
içinde bir fonksiyon kullanırken, o fonksiyonun this
değerine erişmesi gerektiğinde sorunlara yol açabilir.
Ancak, “arrow” (ok) fonksiyonları, kendi kapsamında bir this
değeri yaratmazlar; onları çevreleyen kapsamdaki this
değerini alırlar. Bu nedenle, forEach
içinde arrow fonksiyonu kullanarak bu tür this
sorunlarından kaçınılabilir.
Bu sözdizimini kullanarak, dizideki her bir öğe üzerinde işlem yapabilirsiniz ve this
değeriyle ilgili potansiyel sorunları önleyebilirsiniz. “Arrow” fonksiyonları, kendi çevrelerindeki this
değerini alacaklarından, dış kapsamdaki this
değeriyle çalışmak istediğinizde oldukça kullanışlıdırlar. Örneğin:
function Person() {
this.name = "Ali";
this.namesList = ["Veli", "Ayşe", "Fatma"];
this.addPrefixToNames = function() {
// Arrow fonksiyonu sayesinde, bu fonksiyon içerisindeki 'this' değeri,
// dışarıdaki 'Person' nesnesine ait 'this' değerini alır.
this.namesList.forEach((currentName) => {
console.log(this.name + " ve " + currentName);
});
};
}
const person = new Person();
person.addPrefixToNames();
// Çıktı:
// Ali ve Veli
// Ali ve Ayşe
// Ali ve Fatma
Yukarıdaki örneğimizde, addPrefixToNames
fonksiyonu içerisinde this.name
değerine erişmek istiyoruz. Eğer arrow fonksiyonu kullanmasaydık ve normal bir fonksiyon kullansaydık, this
değeri o fonksiyonun kendi kapsamına ait olacaktı ve doğru çalışmayacaktı. Arrow fonksiyonunun lexically bağlanan this
özelliği sayesinde, dış kapsamdaki this
değerine sorunsuzca erişebiliriz.
“forEach” Metodunu Kullanırken Nelere Dikkat Etmeliyiz?
JavaScript’te “forEach()” metodu kullanırken nelere dikkat etmem gerekir sorumu araştırırken bazı önemli noktaları not aldım:
- Döndürme:
forEach
metodu bir değer döndürmez (ya da daha spesifik olarak,undefined
döndürür). ZiraforEach
metodu temelde dizinin her bir öğesini işlemek için kullanılır. Eğer bir dizi üzerinde işlem yaparak yeni bir dizi elde etmek istiyorsak, map() metodunu kullanmalıyız. - Dizi Değişiklikleri:
forEach()
döngüsü başladığında dizi uzunluğu sabitlenir. Döngü başladıktan sonra yapılan değişiklikler (ekleme veya çıkarma) geri çağırma fonksiyonunun çalışmasını etkilemez. - Döngüyü Erken Sonlandırmak:
forEach()
kullanarak döngüyü erken sonlandıramazsınız. Yanibreak
ya dareturn
ifadeleriforEach()
içinde döngüyü durduramaz. Eğer erken sonlandırma ihtiyacınız varsa,for
döngüsü ya dafor...of
yapısını kullanmalısınız. - Boş Elemanlar:
forEach()
metodu, dizideki boş öğeleri atlar. Yani, eğer dizinizdeundefined
ya da boş değerler varsa,forEach()
bu öğelere geri çağırma fonksiyonunu uygulamaz. - Sadece Diziler İçin:
forEach()
metodu sadece diziler için tanımlıdır. - Performans: Büyük diziler üzerinde işlem yaparken,
forEach()
‘un klasikfor
döngüsüne göre biraz daha yavaş olabileceğini göz önünde bulundurmalısınız. Eğer performans kritikse ve çok büyük diziler üzerinde çalışıyorsanız, alternatif yöntemleri değerlendirmenizde fayda var.