İçeriğe geç
academia.sh

Ders 10 / 21

Doğruluk Değerleri

Mantıksal değere çevirme yordamı, yanlış sayılan sekiz değer, mantıksal işleçlerin değer döndürmesi, boşluk birleştirme ve isteğe bağlı zincirleme.

İçindekiler

Önceki iki ders iki zorlama yordamını tanımladı: sayıya ve metne çevirme. Üçüncüsü, mantıksal değere çevirme, koşullu yapıların temelidir ve iki derstir ertelenen bir soruyu yanıtlar: 0 değeri neden eksik veri sanıldı?

Yordamın kendisi kısadır — sayfa dolusu kural yoktur, sekiz değerden oluşan bir liste vardır. Asıl incelik listede değil, mantıksal işleçlerin bu listeyi nasıl kullandığındadır.

Yanlış Sayılan Sekiz Değer

Mantıksal değere çevirme yordamı bir liste ile tanımlıdır: aşağıdaki sekiz değer yanlış sayılır (falsy), diğer her değer doğru sayılır.

const yanlisSayilanlar = [
  ["false", false],
  ["0", 0],
  ["-0", -0],
  ["0n", 0n],
  ['""', ""],
  ["null", null],
  ["undefined", undefined],
  ["NaN", NaN],
];

for (const [etiket, deger] of yanlisSayilanlar) {
  console.log(etiket.padEnd(10), Boolean(deger));
}
false      false
0          false
-0         false
0n         false
""         false
null       false
undefined  false
NaN        false

Liste kapalıdır: burada olmayan hiçbir değer yanlış sayılmaz. Bu, listeyi ezberlemekten daha kullanışlı bir kuraldır, çünkü sezgiye aykırı örnekleri doğrudan çözer:

console.log(Boolean("0"), Boolean("false"), Boolean(" "));
console.log(Boolean([]), Boolean({}));
console.log(Boolean(-1), Boolean(Infinity));
true true true
true true
true true

Boş olmayan her dizgi doğru sayılır — içeriği ne olursa olsun. "0" ve "false" metinleri de bu kurala girer; sayıya veya mantıksal değere çevrilmezler. Boş dizi ve boş nesne de doğru sayılır: nesneler listede yoktur, bu yüzden hepsi doğrudur. Sıfır dışındaki her sayı, negatifler ve sonsuzluk dahil, doğru sayılır.

Bir noktaya dikkat: Boolean([]) doğru verirken, önceki dersteki [] == false karşılaştırması doğru vermişti. Çelişki yoktur — iki farklı yordam çalışıyor. Gevşek eşitlik diziyi ilkel değere, sonra sayıya çevirir; mantıksal değere çevirme ise nesnenin içine hiç bakmaz. Aynı değerin iki farklı bağlamda farklı sonuç vermesi, hangi yordamın çağrıldığını bilmeyi zorunlu kılar.

Mantıksal İşleçler Mantıksal Değer Döndürmez

&& ve || işleçleri, adlarına rağmen true veya false üretmez. İşlenenlerden birini döndürürler:

console.log(0 || "yedek");
console.log("A1" || "yedek");
console.log(0 && "asla");
console.log("A1" && 21.5);
yedek
A1
0
21.5

Kural şöyledir. || işleci sol işleneni değerlendirir; doğru sayılıyorsa onu döndürür, değilse sağ işleneni döndürür. && işleci sol işleneni değerlendirir; yanlış sayılıyorsa onu döndürür, değilse sağ işleneni döndürür.

Sağ işlenen yalnızca gerektiğinde değerlendirilir. Programlama Temelleri kursundaki İşleçler ve İfadeler dersinde tanımlanan kısa devre değerlendirme budur. Üçüncü satırda "asla" hiç değerlendirilmedi.

Sonucu mantıksal tipe zorlamak gerekiyorsa dönüşüm açıkça yazılır. Koşullu yapılar zaten mantıksal değere çevirdiği için bu genellikle gereksizdir.

Varsayılan Değer Tuzağı

|| işlecinin en yaygın kullanımı eksik değere yedek koymaktır. Bu kullanım, yanlış sayılan değerler geçerli veri olduğunda bozulur:

const kayitlar = [
  { istasyon: "A1", sicaklik: 21.5 },
  { istasyon: "A2", sicaklik: 0 },
  { istasyon: "B1" },
];

for (const k of kayitlar) {
  const veyaIle = k.sicaklik || -273.15;
  const bosIle = k.sicaklik ?? -273.15;
  console.log(k.istasyon, "|| ->", veyaIle, " ?? ->", bosIle);
}
A1 || -> 21.5  ?? -> 21.5
A2 || -> -273.15  ?? -> 0
B1 || -> -273.15  ?? -> -273.15

Orta satır, iki derstir açık bırakılan sorunun yanıtıdır. A2 istasyonunun sıcaklığı 0’dır; bu geçerli bir ölçümdür ve kayıtta vardır. Yine de || işleci onu yanlış saydı ve yedek değere geçti. Ölçüm, mutlak sıfır sıcaklığına dönüştü.

Alt satırdaki B1 kaydında ise sıcaklık alanı gerçekten yoktur; k.sicaklik değeri undefined’dır ve yedek değere geçmesi doğrudur. İki satır aynı sonucu üretti, ama yalnızca biri istenen davranıştı — || işleci “değer yok” ile “değer sıfır” durumlarını ayırt edemez.

?? işleci — boşluk birleştirme (nullish coalescing) — yalnızca null ve undefined değerlerinde sağ işlenene geçer:

console.log(0 || "yedek");
console.log(0 ?? "yedek");
console.log("" || "yedek");
console.log("" ?? "yedek");
console.log(null ?? "yedek");
yedek
0
yedek

yedek

Dördüncü satırın boş görünmesi, ?? işlecinin boş dizgiyi geçerli bir değer sayıp döndürmesindendir. İkinci satır ise 0 değerini korudu.

Seçim kuralı nettir: “değer verilmemişse” anlamı isteniyorsa ??, “değer yanlış sayılıyorsa” anlamı isteniyorsa || kullanılır. Ölçüm verisinde sıfır, boş dizgi ve false çoğu zaman geçerli değerlerdir; bu yüzden varsayılan atamaları ?? ile yazılır.

İsteğe Bağlı Zincirleme

Aynı ailenin üçüncü işleci, iç içe alanlara erişirken yokluk denetimini kısaltır:

const kayit = { istasyon: "A1", konum: { yukseklik: 120 } };
const eksik = { istasyon: "B1" };
console.log(kayit.konum?.yukseklik);
console.log(eksik.konum?.yukseklik);
console.log(eksik.konum?.yukseklik ?? 0);
120
undefined
0

?. işleci, solundaki değer null veya undefined ise zinciri keser ve undefined döndürür; değilse erişimi sürdürür. Denetimin ölçütü ?? ile aynıdır — yanlış sayılan değerler değil, yalnızca iki yokluk değeri.

İşleç olmadan aynı erişim hata verir:

const eksik = { istasyon: "B1" };
try {
  console.log(eksik.konum.yukseklik);
} catch (hata) {
  console.log(hata.name + ": " + hata.message);
}
TypeError: Cannot read properties of undefined (reading 'yukseklik')

Kod Çalıştırma Yolları dersinde bu iletinin nasıl okunacağı gösterilmişti: sorun yukseklik alanında değil, eksik.konum değerinin undefined olmasındadır.

İsteğe bağlı zincirleme dikkatli kullanılmalıdır. Bir alanın eksik olması beklenen bir durumsa doğru araçtır; beklenmeyen bir durumsa, hatayı bastırıp sorunu ileriye taşır. Aradaki fark verinin sözleşmesindedir, sözdiziminde değil.

Ölçüm Betiğine Uygulama

Doğruluk değerlerinin en kısa kullanımı süzme işlemidir:

const alanlar = ["21.5", "", "0", "abc", null];
const dolular = alanlar.filter(Boolean);
console.log(dolular);
[ '21.5', '0', 'abc' ]

Boş dizgi ve null elendi; "0" metni korundu, çünkü boş olmayan bir dizgidir. Bu tam olarak istenen davranıştır: burada süzülen şey ham metindir, sayısal değer değil.

Sayısal değerlere aynı süzgeci uygulamak ise veri kaybettirir:

const olcumler = [21.5, 0, NaN, 19.75];
console.log(olcumler.filter(Boolean));
console.log(olcumler.filter((d) => !Number.isNaN(d)));
[ 21.5, 19.75 ]
[ 21.5, 0, 19.75 ]

İlk süzgeç geçerli bir sıfır ölçümünü attı. İkincisi yalnızca gerçekten geçersiz olanı attı. Kural, doğruluk değerlerinin genel bir geçerlilik ölçütü olmamasıdır: neyin geçerli sayıldığı verinin anlamına bağlıdır ve açıkça yazılmalıdır.

Özet

  • Mantıksal değere çevirme sekiz değeri yanlış sayar: false, 0, -0, 0n, boş dizgi, null, undefined, NaN. Diğer her değer doğru sayılır.
  • Boş dizi, boş nesne ve "0" gibi metinler doğru sayılır; nesneler listede yoktur.
  • && ve || mantıksal değer değil, işlenenlerden birini döndürür ve sağ işleneni yalnızca gerektiğinde değerlendirir.
  • || sekiz değerin tamamında yedeğe geçer; ?? yalnızca null ve undefined durumunda geçer. Ölçüm verisinde varsayılan atamaları ?? ile yazılır.
  • ?. zinciri yalnızca null ve undefined değerlerinde keser; beklenmeyen eksikliği gizlemek için kullanılmamalıdır.

Sonraki Adım

Değer modeli tamamlandı: hangi tipler var, nasıl dönüşüyorlar, nasıl karşılaştırılıyorlar ve koşulda nasıl değerlendiriliyorlar. Sıra bu değerlerle program akışı kurmakta. Sonraki konu koşullu seçimle başlayacak: if zincirleri, üçlü işleç ve switch deyiminin karşılaştırma için hangi eşitliği kullandığı — bu dersteki üç işleçten biri.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat