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ızcanullveundefineddurumunda geçer. Ölçüm verisinde varsayılan atamaları??ile yazılır.?.zinciri yalnızcanullveundefineddeğ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.