kodingup.camp

Beranda/JavaScript Mastery: Fundamentals

Struktur Pengambilan Keputusan

Modul 12 dari 164 menit bacaDecision-making structures

Isi modul

    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:

    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
    }
    

    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

    1. Urutan kondisi salah. Cek kondisi paling spesifik atau paling ketat dulu (nilai ≥ 85 sebelum ≥ 70).
    2. Memakai = di dalam kondisi. if (x = 5) mengisi x dengan 5 dan selalu truthy. Gunakan ===.
    3. Lupa break di switch. Eksekusi jatuh ke case berikutnya. Tambahkan break di setiap case kecuali fall through yang disengaja.
    4. Mengira array kosong atau string "0" itu falsy. Keduanya truthy. Cek arr.length === 0 atau bandingkan string secara eksplisit.
    5. Mencocokkan tipe yang berbeda di switch. Input prompt bertipe string, jadi case 1 tidak akan cocok dengan "1". Konversi dulu atau tulis case "1".

    Latihan

    1. Mudah, Tulis program yang mencetak "Genap" atau "Ganjil" untuk sebuah angka, lalu tambahkan cabang khusus "Nol" kalau angkanya 0.
    2. 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.
    3. Menantang, Buat function namaHari(n) dengan switch yang mengubah angka 1-7 menjadi Senin-Minggu dan menerima input string ("3") maupun number (3). Tambahkan function jenisHari(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

    Kuis pemahaman

    Pilih satu jawaban per soal. Penjelasan muncul setelah kamu menjawab.