JavaScript mülakat soruları 11. bölüme hoş geldiniz. Bu bölümde, JavaScript döngülerini, fonksiyonlarını, nesnelerini ve destructuring atama gibi özelliklerini inceliyoruz. Ayrıca, JavaScript’te falsy ve truthy değerlerin nasıl kullanıldığını ve bu değerlerin karşılaştırma operatörleriyle nasıl etkileşime girdiğini gözden geçiriyoruz. Diğer bölümlere JavaScript kategorisinden ulaşabilirsiniz.
Toplamda 100 soruyu bıraktığımız JavaScript mülakat soruları serimize şimdi 101. sorudan devam edelim.
SORU 101
let nums = [1, 2, 3, 4, 5];
nums.forEach(e => {
if(e > 2 && e < 5) console.log(e)
})
Burada forEach yapısı karşımıza çıkıyor. forEach de tıpkı for gibi bir döngüdür. Yaptığı şey dizinin tüm elemanlarını tek tek dolaşmak ve koşula uygun bir şekilde çıktı üretmektir.
nums dizimizi forEach döngüsü ile gezeriz. Döngümüz e adında bir parametre alır. (Ok fonksiyonu ile ifade ettik.) Koşullu ifadeye göre parametremizin 2 ile 5 arasında olması gerekir. Bu durumda forEach döngüsü nums dizisinin elemanlarını tek tek dolaşacak ve koşula uygun elemanları döndürecektir. Bu durumda konsolda 3 ve 4 çıktılarını alırız.
SORU 102
let fruits = ["elma", "armut", "muz"];
let fruitsIwanted = fruits.filter(f => f.startsWith("m"));
console.log(fruitsIwanted);
fruits dizimiz 3 elemanlı bir dizi. Alt tarafta fruitsIwanted değişkeni ile fruits dizimizi filtreleyerek m harfi ile başlayan elemanları alıyoruz.
fruits.filter(f => f.startsWith(“m”)); ifadesi fruits dizisini filtreler. Burada filter fonksiyonumuz parametre olarak f değerini alıyor. f değeri de bir ok fonksiyonu içinde gösterilmiş ve bu da fruits dizisinde yer alan ve m ile başlayan elemanları alıyor. Sonuç olarak konsolda muz çıktısını görürüz.
SORU 103
let a = {
b: "c",
type: ()=>{
return this.b === "c"
}
};
console.log(a.type());
Hatırlayacağımız üzere ok (arrow) fonksiyonlarında this anahtar kelimesinin yerel bağlamı yoktu. Veriyi global bağlamdan çekiyordu. Bu yüzden this.b === "c"
ifadesindeki b
değeri yerel bağlamdaki b
değerini almayacak, global bağlamdaki b değerini almaya çalışacaktır. Global bağlamda b değeri tanımlanmadığı için eşitlik sağlanamayacak ve sonuç olarak konsolda false çıktısını göreceğiz.
SORU 104
let firstNum = 11;
let value = !!firstNum && !!!firstNum;
console.log(value);
firstNum değerimiz 11. Yani truthy bir değer. value değişkenimizde iki tane not (!) operatörü var. Bu da şu demek: truthy olan değeri önce false yap, ardından da true yap. Sonuç olarak && operatörü karşılaştırmasındaki ilk değerimiz true olur. İkinci ifadede ise true olan değerimiz önce false, ardından true ve ardından da tekrar false olacaktır. Yani && karşılaştırma operatöründeki ikinci değerimiz de false olacaktır. Hatırlarsa && (ve) operatörü bulduğu ilk false değerini döndürüyordu. Bu durumda ikinci ifade olan false dönecektir.
SORU 105
const firstArr = [5, 6, 7];
const secondArr = [5, 6, 8];
const result = firstArr.concat(
secondArr.filter(num => {
return !firstArr.includes(num);
})
);
console.log(result);
İki tane dizimiz var. Bunlardan ilki firstArr, ikincisi ise secondArr.
result değişkenimiz iki aşamalı bir işlemden geçerek bir değer alıyor. Bu tip çok katmanlı fonksiyonlarda işlemlerimize önce iç taraftan başlarız. Dolayısıyla önce secondArr.filter(…) işlemini yaparız. Burada secondArr dizimizi filtreliyoruz ve parametere olarak num veriyoruz. num parametresi secondArr dizisinin elemanlarını tek tek gezer ve ilk dizi içinde yer almayan elemanları döndürür. Çünkü filtreleme fonksiyonumuzun içinde return !firstArr.includes(num); ifadesi var. Burada !firstArr.includes(num) ifadesiyle firstArr dizisi parametre olarak secondArr dizisinin elemanlarını alır ve firstArr dizisinde bulunmayan elemanları filtreler. 5, 6 ve 8 değerlerinden sadece 8 firstArr dizisinde bulunmaz. Bu yüzden ilk işlemden 8 çıktısını elde ederiz.
İkinci aşamada firstArr dizisiyle secondArr dizisini birleştiririz. firstArr dizisinin elemanları 5, 6, 7, secondArr dizisinin filtrelememiz sonucu ortaya çıkan değerimiz ise 8 idi. Bu durumda bu değerler birleşerek yeni bir dizi ortaya çıkacak. Yani çıktı olarak [5, 6, 7, 8] dizisini konsolda görürüz.
SORU 106
const sum = (a) => a + a;
function add (num = 2, val = sum(num)) {
console.log(num, val);
};
add(3);
add fonksiyonumuzu 3 parametresi ile çağırıyoruz. add fonksiyonumuzun iki parametresi var. İlki num = 2 diğeri de val = sum(num). num, 3 parametresi ile çağrıldığı için ilk parametrenin yeni değeri 2 yerine 3 olacaktır. İkinci parametremiz olan val = sum(num) eşitliğinde num yerine 3 değeri gelecektir. sum değişkeni üst tarafta const sum = (a) => a + a; olarak belirlenmiş. Burada a parametresinin yerine 3 değerini yerleştirdiğimizde çıktı olarak 6 alırız. Bu durumda val = sum(num) eşitliğinden val‘ın değerini 6 olarak buluruz.
console.log(num, val); ifadesinde değerleri yerine yerleştirdiğimizde, 3 ve 6 çıktılarını elde ederiz.
SORU 107
const member = true;
const person1 = {
name: "Şekip",
...(member && {isMember: true})
};
console.log(person1)
member adlı bir sabitimiz var ve değeri true. Ayrıca person1 adlı bir nesnemiz ve bu nesnemizin de iki tane key:value çifti var.
person1 nesnemizi konsola yazdırmak istiyoruz. İlk değer hiç şüphesiz name: “Şekip” olacaktır. İkinci değer ise bir spread (yayma) operatörü. Bu operatör member sabiti ile {isMember: true} nesnesini && (ve) operatörüyle karşılaştırır. && operatörü bulduğu ilk falsy değeri döndürüyordu. Eğer hiç falsy değer yoksa en sağdaki değer dönüyordu. Şimdi member sabitimizin değeri zaten true. İkinci değerimiz olan {isMember: true} ifadesi de truthy bir değerdir. Bu yüzden bu nesne dönecektir. Yani spread operatörünün döndürdüğü değer bu nesne olacaktır.
console.log(person1) ifadesi çalıştığında konsolda {name: ‘Şekip’, isMember: true} çıktısını görürüz.
SORU 108
const firstNum = 0;
const secondNum = "0";
const val1 = firstNum || null;
const val2 = secondNum || null;
console.log(val1);
console.log(val2);
Tekrar amaçlı karşılaştırma operatörlerine değinelim.
firstNum değerimiz 0. Hatırlayacağımız üzere 0 falsy bir değerdi. secondNum değerimiz ise “0”. Yani string olan 0. String değerler varsayılan olarak truthy idi.
const val1 = firstNum || null; karşılaştırmasında aslında 0 || null karşılatırmasını yapıyoruz. Her iki değer de falsy. || (veya) operatörü bulduğu ilk truthy değeri döndürüyordu. Eğer hiç truthy değer yoksa en sondaki değer dönüyordu. Bu durumda val1 sabitinin değeri null olacaktır.
const val2 = secondNum || null; karşılaştırmasında da aslında “0” || null karşılaştırmasını yapıyoruz. İlk değer truthy ikinci değer ise falsy. || operatörü bulduğu ilk truthy değeri döndüreceği için val2 sabitinin değeri 0 olacaktır.
val1 ve val2 sabitlerini sırasıyla konsola yazdırdığımızda null ve 0 çıktılarını görürüz.
SORU 109
const member = {name: "Şekip", age: "33"};
const boss = {isBoss: true, ...member};
console.log(boss);
Toplamda iki nesnemiz var. İlki member nesnesi ve iki tane özelliği var. Diğeri de boss nesnesi ve bunun da aynı şekilde iki tane özelliği var.
boss nesnesinde …member ifadesi bir spread operatörü. Bu operatör member nesnesinin özelliklerini kopyalayarak boss nesnesine geçirir. Bu durumda boss nesnesinin özellikleri sırasıyla şunlar olacaktır: isBoss: true, name: “Şekip”, age: “33”. Aynı şekilde konsolda da bu değerleri göreceğiz. Yani çıktı olarak {isBoss: true, name: ‘Şekip’, age: ’33’} nesnesini alırız.
SORU 110
let firstVal = 11;
let secondVal = 12;
[firstVal, secondVal] = [secondVal, firstVal]
console.log(firstVal);
console.log(secondVal);
Burada destructuring atamasının bir kullanımını görüyoruz.
[firstVal, secondVal] = [secondVal, firstVal] ifadesinde firstVal’ın değeri secondVal’a, secondVal’ın değeri ise firstVal’a atanıyor. Bu durumda 11 değeri secondVal’ın, 12 değeri ise firstVal’ın olacaktır. Konsolda sırasıyla 12 ve 11 değerlerini görürüz.
JavaScript mülakat soruları serimizin bu bölümünün de sonuna geldik. JavaScript mülakat soruları serimiz ilerleyen konularla devam edecek. Takipte kalın. Yeni sorularda görüşmek dileğiyle!