Kenapa ini penting
Program yang hanya berjalan lurus dari atas ke bawah tidak bisa bereaksi terhadap situasi. Di kehidupan nyata, keputusan ada di mana-mana. Kalau hujan, bawa payung. Kalau saldo cukup, transaksi diproses, kalau tidak, tampilkan pesan gagal. Kalau nilai di atas 85, dapat A. Struktur keputusan (percabangan) membuat program memilih jalan berdasarkan kondisi. Di modul ini kamu belajar if/else, switch, dan konsep truthy/falsy yang menentukan bagaimana JavaScript menilai "benar" dan "salah".
Konsep inti
if, else if, else
if (kondisi1) {
// dijalankan kalau kondisi1 benar
} else if (kondisi2) {
// dijalankan kalau kondisi1 salah DAN kondisi2 benar
} else {
// dijalankan kalau semua kondisi di atas salah
}
Hal yang perlu dipahami:
- Kondisi dicek berurutan dari atas. Begitu satu kondisi benar, bloknya dijalankan dan sisanya dilewati. Urutan kondisi itu penting.
else ifdanelsebersifat opsional.- Selalu pakai kurung kurawal
{ }, bahkan untuk satu baris. Ini mencegah bug ketika kamu menambah baris nanti.
Analogi: satpam di pintu konser. "Kalau punya tiket VIP, masuk lewat pintu A. Kalau tiket reguler, pintu B. Selain itu, ke loket." Satpam berhenti mengecek begitu menemukan kategori yang cocok.
Guard clause (early return)
Daripada membuat if bersarang dalam-dalam, tangani kasus "gagal" lebih dulu lalu keluar. Kode jadi lebih datar dan mudah dibaca. Teknik ini sangat umum di dalam function (dibahas di modul function, tapi contohnya sudah muncul di bawah).
switch
switch cocok ketika kamu membandingkan satu nilai dengan banyak kemungkinan nilai tetap:
switch (nilai) {
case "a":
// ...
break;
case "b":
case "c":
// dijalankan untuk "b" atau "c"
break;
default:
// tidak ada yang cocok
}
switchmembandingkan dengan===(strict).case 1tidak cocok dengan"1".breakwajib untuk keluar. Tanpabreak, eksekusi "jatuh" (fall through) ke case berikutnya. Kadang ini sengaja dipakai untuk menggabungkan beberapa case.defaultdijalankan kalau tidak ada case yang cocok.
Kapan pakai if dan kapan switch? Pakai if untuk rentang dan kondisi kompleks (nilai >= 85, a && b). Pakai switch untuk mencocokkan satu nilai dengan daftar pilihan tetap (nama hari, kode menu, status pesanan).
Truthy dan falsy
Kondisi di if tidak harus boolean. JavaScript mengubah nilai apa pun ke boolean. Hanya ada sedikit nilai yang dianggap falsy:
| Falsy (dianggap false) |
|---|
false |
0, -0, 0n |
"" (string kosong) |
null |
undefined |
NaN |
Semua nilai lain truthy, termasuk yang sering mengejutkan:
| Truthy yang menjebak | Keterangan |
|---|---|
"0" |
String berisi karakter nol, bukan kosong |
"false" |
String berisi kata false |
" " |
String berisi spasi |
[] |
Array kosong |
{} |
Object kosong |
-1 |
Angka negatif |
Untuk mengecek array kosong, gunakan arr.length === 0, bukan if (!arr). Untuk melihat nilai boolean sebuah nilai, gunakan Boolean(x) atau !!x.
Contoh kode
// if / else if / else: konversi nilai ke huruf
const nilai = 78;
let grade;
if (nilai >= 85) {
grade = "A";
} else if (nilai >= 70) {
grade = "B";
} else if (nilai >= 55) {
grade = "C";
} else {
grade = "D";
}
console.log(`Nilai ${nilai} = ${grade}`); // → Nilai 78 = B
// Urutan itu penting! Versi SALAH:
const n = 90;
if (n >= 55) {
console.log("C"); // → C (langsung cocok di sini, padahal seharusnya A)
} else if (n >= 85) {
console.log("A");
}
// Kondisi gabungan
const umur = 20;
const punyaKtp = true;
if (umur >= 17 && punyaKtp) {
console.log("Boleh membuat rekening"); // → Boleh membuat rekening
}
// Guard clause di dalam function
function prosesBayar(saldo, harga) {
if (harga <= 0) return "Harga tidak valid";
if (saldo < harga) return "Saldo tidak cukup";
return `Berhasil. Sisa saldo: ${saldo - harga}`;
}
console.log(prosesBayar(50000, 70000)); // → Saldo tidak cukup
console.log(prosesBayar(50000, 20000)); // → Berhasil. Sisa saldo: 30000
switch dan truthy/falsy:
// switch: menu restoran
const kodeMenu = 2;
switch (kodeMenu) {
case 1:
console.log("Nasi goreng");
break;
case 2:
console.log("Mie ayam"); // → Mie ayam
break;
default:
console.log("Menu tidak tersedia");
}
// Beberapa case digabung (fall through yang disengaja)
const hari = "Minggu";
switch (hari) {
case "Sabtu":
case "Minggu":
console.log("Akhir pekan"); // → Akhir pekan
break;
default:
console.log("Hari kerja");
}
// Jebakan lupa break
const level = 1;
switch (level) {
case 1:
console.log("Pemula");
case 2:
console.log("Menengah"); // ikut tercetak karena tidak ada break!
break;
}
// → Pemula
// → Menengah
// Truthy / falsy
const nilaiUji = [0, "", "0", " ", [], {}, null, undefined, NaN, -1, "false"];
for (const v of nilaiUji) {
console.log(JSON.stringify(v) ?? String(v), "→", Boolean(v));
}
// → 0 → false
// → "" → false
// → "0" → true
// → " " → true
// → [] → true
// → {} → true
// → null → false
// → undefined → false
// → null → false (JSON.stringify(NaN) menghasilkan "null")
// → -1 → true
// → "false" → true
// Cek array kosong dengan benar
const keranjang = [];
if (keranjang.length === 0) {
console.log("Keranjang masih kosong"); // → Keranjang masih kosong
}
Kesalahan umum
- Urutan kondisi salah. Cek kondisi paling spesifik atau paling ketat dulu (nilai ≥ 85 sebelum ≥ 70).
- Memakai
=di dalam kondisi.if (x = 5)mengisixdengan 5 dan selalu truthy. Gunakan===. - Lupa
breakdiswitch. Eksekusi jatuh ke case berikutnya. Tambahkanbreakdi setiap case kecuali fall through yang disengaja. - Mengira array kosong atau string
"0"itu falsy. Keduanya truthy. Cekarr.length === 0atau bandingkan string secara eksplisit. - Mencocokkan tipe yang berbeda di
switch. Inputpromptbertipe string, jadicase 1tidak akan cocok dengan"1". Konversi dulu atau tuliscase "1".
Latihan
- Mudah, Tulis program yang mencetak
"Genap"atau"Ganjil"untuk sebuah angka, lalu tambahkan cabang khusus"Nol"kalau angkanya 0. - Sedang, Buat function
tarifParkir(jam): jam pertama Rp5.000, setiap jam berikutnya Rp3.000, maksimal Rp25.000 per hari. Kembalikan"Input tidak valid"untuk jam ≤ 0. - Menantang, Buat function
namaHari(n)denganswitchyang mengubah angka 1-7 menjadi Senin-Minggu dan menerima input string ("3") maupun number (3). Tambahkan functionjenisHari(n)yang mengembalikan"Akhir pekan"atau"Hari kerja".
Lihat solusi
1.
function cekAngka(x) {
if (x === 0) {
return "Nol";
} else if (x % 2 === 0) {
return "Genap";
} else {
return "Ganjil";
}
}
console.log(cekAngka(0), cekAngka(4), cekAngka(7)); // → Nol Genap Ganjil
2.
function tarifParkir(jam) {
if (jam <= 0) return "Input tidak valid";
const tarif = 5000 + (jam - 1) * 3000;
return tarif > 25000 ? 25000 : tarif;
}
console.log(tarifParkir(1)); // → 5000
console.log(tarifParkir(3)); // → 11000
console.log(tarifParkir(10)); // → 25000
console.log(tarifParkir(0)); // → Input tidak valid
3.
function namaHari(n) {
switch (Number(n)) {
case 1: return "Senin";
case 2: return "Selasa";
case 3: return "Rabu";
case 4: return "Kamis";
case 5: return "Jumat";
case 6: return "Sabtu";
case 7: return "Minggu";
default: return "Tidak valid";
}
}
function jenisHari(n) {
const nama = namaHari(n);
if (nama === "Tidak valid") return nama;
return nama === "Sabtu" || nama === "Minggu" ? "Akhir pekan" : "Hari kerja";
}
console.log(namaHari("3"), jenisHari(3)); // → Rabu Hari kerja
console.log(namaHari(7), jenisHari("7")); // → Minggu Akhir pekan
console.log(namaHari(9)); // → Tidak valid
return di dalam case langsung keluar dari function, jadi break tidak diperlukan.
Ringkasan
if / else if / elsemengecek kondisi berurutan dan berhenti di kondisi benar pertama. Urutan penting.- Guard clause (tangani kasus gagal lebih dulu, lalu
return) membuat kode lebih datar. switchmencocokkan satu nilai dengan===. Jangan lupabreakdandefault.- Nilai falsy:
false,0,-0,0n,"",null,undefined,NaN. Selain itu truthy, termasuk[],{}, dan"0". - Cek array kosong dengan
arr.length === 0.