Mantıksal Operatörler (Logical Operators)

JavaScript'te bir süredir çalışıyorsan, muhtemelen AND (&&) ve OR (||) operatörlerine aşinasındır:

const isLoggedIn = true;
const userRole = 'administrator';

if (isLoggedIn && userRole === 'administrator') {
  // Bu kod yalnızca HER İKİ koşul da doğruysa çalışır
}

Ancak çoğu JavaScript geliştiricisinin farkında olmadığı bir şey var: Bu operatörler yalnızca mantıksal karşılaştırmalar için değil, aynı zamanda kontrol akışı (control flow) için de kullanılabilir.

&& Operatörünün Çalışma Mantığı

Aşağıdaki kodun sonucunun ne olacağını tahmin et:

const myAge = 35;
const result = myAge < 50 && myAge;

İlk bakışta true olmasını bekleyebilirsin:

Ancak && operatörü her zaman bir boolean değer döndürmez. Bunun yerine operatörün sağ veya sol tarafındaki bir ifadeyi döndürür.

Bu operatörü bir kapı (gate) gibi düşünebilirsin. Sol taraftaki ifade doğruluk değeri (truthy) taşıyorsa, sağ taraftaki ifadeye geçiş sağlanır.

Bu durum, birden fazla && kullanıldığında daha net anlaşılır:

const numOfChildren = 4;
const parkingHasBeenValidated = true;
const signatureOnWaiver = '';

const admissionTicket =
  numOfChildren &&
  parkingHasBeenValidated &&
  signatureOnWaiver &&
  generateTicket();

Burada ilk falsy değer olan signatureOnWaiver döndürülür ve generateTicket() fonksiyonu asla çalıştırılmaz.

Peki signatureOnWaiver falsy olmasaydı?

const signatureOnWaiver = 'Becky Chambers';

Bu durumda tüm geçişler açılır ve generateTicket() fonksiyonu çalıştırılır. admissionTicket değişkeni, fonksiyonun döndürdüğü değeri alır.

Aynı işlemi if/else ile yazarsak:

let admissionTicket;

if (!numOfChildren) {
  admissionTicket = numOfChildren;
} else if (!parkingHasBeenValidated) {
  admissionTicket = parkingHasBeenValidated;
} else if (!signatureOnWaiver) {
  admissionTicket = signatureOnWaiver;
} else {
  admissionTicket = generateTicket();
}

Gördüğün gibi mantıksal operatörler, uzun if/else bloklarını daha kısa ve okunaklı hale getirebilir.

Kısa Devre (Short-Circuiting) Mantığı

Mantıksal operatörler, gereksiz işlemleri atlamak için kısa devre yapabilir (short-circuiting).

false && console.log('Bu asla çalışmayacak');

Burada false olduğu için console.log() çalıştırılmaz. Aynı şey if bloğunda da geçerli olurdu:

if (false) {
  console.log('Bu asla çalışmayacak');
}

|| Operatörünün Çalışma Mantığı

|| (OR) operatörü, && operatörüyle benzer çalışır ama tersi şekilde ilerler.

Örnek:

const userImageSrc = null;
const teamImageSrc = null;
const defaultImageSrc = '/images/cat.jpg';

const src = userImageSrc || teamImageSrc || defaultImageSrc;

Burada:

Bu yüzden src değişkeni '/images/cat.jpg' değerini alır.

Eğer ilk değer truthy olsaydı, diğerlerine hiç bakılmazdı:

const userImageSrc = '/images/my-avatar.png';
const teamImageSrc = null;
const defaultImageSrc = '/images/cat.jpg';

const src = userImageSrc || teamImageSrc || defaultImageSrc;

Burada:

Yani src değişkeni '/images/my-avatar.png' olur ve diğer değerlere hiç bakılmaz.

Bunu if/else ile yazarsak:

let src;

if (userImageSrc) {
  src = userImageSrc;
} else if (teamImageSrc) {
  src = teamImageSrc;
} else {
  src = defaultImageSrc;
}

Özet

Mantıksal operatörleri bu şekilde kullanarak kodunu daha okunaklı ve sade hale getirebilirsin! 🎯