Toko tempat Budi belanja menjalankan promo berlapis: member dengan belanja besar mendapat diskon 20%, belanja besar tanpa status member mendapat 10%, dan sisanya mengikuti aturan yang lebih kecil lagi. Mesin kasir tidak bisa menebak cabang mana yang berlaku — program harus memeriksa kondisi tertentu lalu memilih satu tindakan. Struktur yang melakukan pekerjaan itu disebut if-else, fondasi pengambilan keputusan di hampir semua program yang pernah kita tulis.

Chapter ini membangun keputusan bertingkat secara bertahap: mulai dari if tunggal, menambahkan else if dan else, lalu merangkai semuanya dalam program kasir yang menentukan diskon belanja. Kita juga membuktikan satu perilaku yang sering mengherankan pemula: blok dengan kondisi false dan tanpa else tidak mencetak apa pun — dan itu bukan pesan kesalahan.

Kondisi: Pertanyaan yang Jawabannya true atau false #

Statement if memiliki bentuk dasar: kata kunci if, kondisi di dalam tanda kurung, lalu blok kode { } yang hanya dijalankan ketika kondisi bernilai true. Ketika engine sampai pada baris if, engine mengevaluasi kondisinya menjadi boolean, lalu memutuskan: true berarti masuk ke blok, false berarti blok dilewati begitu saja dan eksekusi berlanjut ke baris setelah blok.

Kondisi yang baik biasanya berupa expression perbandingan atau logika dari section Operators — misalnya >=, ===, dan && — sehingga hasilnya boolean yang jelas:

js
let angka = 4;
if (angka % 2 === 0) {
  console.log(angka, "adalah bilangan genap");
}
console.log("Baris ini selalu jalan, apa pun hasil kondisinya");

Output yang Dihasilkan:

text
4 adalah bilangan genap
Baris ini selalu jalan, apa pun hasil kondisinya

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 1 (let angka = 4;): variabel angka menampung nilai yang akan diperiksa.
  2. Baris 2 (if (angka % 2 === 0)): engine menghitung 4 % 2 yang menghasilkan 0, membandingkan dengan === sehingga kondisinya bernilai true, lalu membuka blok.
  3. Baris 3 (console.log(...)): karena kondisi true, pesan genap dicetak.
  4. Baris 5 (console.log(...)): baris ini berada di luar blok, sehingga tidak terpengaruh hasil kondisi dan selalu dieksekusi.

else dan else if: Memilih Satu Cabang dari Banyak #

Satu if hanya memberi dua kemungkinan: jalan atau dilewati. Keputusan nyata sering memiliki lebih dari dua cabang. Kita menyusunnya menjadi rantai if ... else if ... else ... yang dibaca dari atas ke bawah: engine memeriksa kondisi satu per satu, menjalankan blok pada cabang pertama yang lolos, lalu mengabaikan seluruh cabang lainnya — termasuk cabang yang kondisinya juga sebenarnya lolos.

js
let nilaiUjian = 78;

if (nilaiUjian >= 85) {
  console.log("Nilai: A");
} else if (nilaiUjian >= 70) {
  console.log("Nilai: B");
} else if (nilaiUjian >= 55) {
  console.log("Nilai: C");
} else {
  console.log("Nilai: D");
}

Output yang Dihasilkan:

text
Nilai: B

78 >= 85 bernilai false, sehingga cabang pertama dilewati. 78 >= 70 bernilai true, sehingga Nilai: B dicetak dan pemeriksaan berhenti di situ — cabang >= 55 yang secara matematis juga lolos tidak pernah diperiksa. Urutan kondisi menjadi bagian dari logika: taruh syarat yang paling ketat paling atas.

Tiga kata kunci itu punya peran yang bisa dirangkum sekali untuk seluruh chapter:

Kata kunciPeranBlok berjalan bila
if (kondisi)pemeriksaan pertamakondisinya true
else if (kondisi)alternatif berikutnyasemua kondisi sebelumnya false dan kondisinya true
elsepenutup tanpa syaratsemua kondisi sebelumnya false

Kondisi dari Variabel Boolean #

Kondisi if tidak harus berupa perbandingan — nilai boolean yang sudah tersimpan di variabel bisa langsung menjadi kondisi. Pola ini muncul ketika hasil pemeriksaan disimpan lebih dulu, misalnya status stok yang dibaca dari data:

js
const stokHabis = false;
if (stokHabis === false) {
  console.log("Stok tersedia");
}
if (!stokHabis) {
  console.log("Stok tersedia (versi ringkas)");
}

Output yang Dihasilkan:

text
Stok tersedia
Stok tersedia (versi ringkas)

Kedua bentuk menghasilkan keputusan yang sama. Bentuk pertama membandingkan boolean secara eksplisit dengan ===; bentuk kedua membalik nilai dengan operator ! dari section Operators dan lebih lazim di kode profesional. Pilih satu gaya dan konsisten di satu berkas, agar pembaca tidak mengira kedua pemeriksaan itu berniat berbeda.

Meskipun kondisi boleh berupa nilai apa pun, engine tetap mengonversinya menjadi boolean lewat aturan truthy-falsy yang kita pelajari di section Values dan Types. Untuk control flow, biasakan kondisi yang jelas menghasilkan true atau false — keputusan program menjadi mudah ditebak tanpa perlu mengingat tabel konversi.

Contoh Lengkap: Diskon Belanja di Kasir Toko #

Berkas berikut merangkum seluruh pola di atas dalam aturan promo toko: kombinasi status member dan total belanja dipetakan ke persen diskon dengan operator logika && dan rantai else if:

// diskon-belanja.js
// Menentukan diskon dari total belanja dan status member dengan if / else if / else.

const isMember = true;
let totalBelanja = 320000;
let persenDiskon = 0;

if (isMember && totalBelanja >= 300000) {
  persenDiskon = 20;
} else if (totalBelanja >= 300000) {
  persenDiskon = 10;
} else if (totalBelanja >= 150000) {
  persenDiskon = 5;
} else {
  persenDiskon = 0;
}

console.log("Status member:", isMember);
console.log("Total belanja:", totalBelanja);
console.log("Diskon:", persenDiskon + "%");

// if tanpa else: jika kondisi tidak terpenuhi, blok ini diabaikan seluruhnya
if (totalBelanja >= 1000000) {
  console.log("Voucher spesial Rp50000 dikirim ke akun Anda");
}

Output yang Dihasilkan:

text
Status member: true
Total belanja: 320000
Diskon: 20%

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 4–6 (const isMember, let totalBelanja, let persenDiskon): tiga variabel disiapkan. persenDiskon diisi 0 sejak awal sehingga selalu punya nilai meski tak ada cabang yang mengubahnya.
  2. Baris 8 (if (isMember && totalBelanja >= 300000)): kedua syarat diperiksa dengan &&; keduanya true, jadi cabang ini yang dijalankan.
  3. Baris 9 (persenDiskon = 20;): diskon 20% tercatat. Setelah blok selesai, engine melompati seluruh cabang else if dan else — pemeriksaan tidak dilanjutkan.
  4. Baris 10–15 (else if ... else ...): cabang-cabang ini adalah rencana cadangan yang hanya dieksekusi bila cabang sebelumnya gagal. Pada data kita, semuanya dilewati.
  5. Baris 18–20 (console.log(...)): tiga baris keluaran menampilkan status member, total belanja, dan hasil keputusan 20%.
  6. Baris 23 (if (totalBelanja >= 1000000)): 320000 >= 1000000 bernilai false dan struktur ini tidak punya else, sehingga blok voucher diabaikan tanpa mencetak apa pun — itulah sebabnya keluaran berhenti di tiga baris.

Cabang yang Dilewati Bukan Pesan Kesalahan #

Perhatikan bahwa program di atas berakhir tanpa baris voucher, dan Node tidak mencetak peringatan apa pun. if tanpa else bermakna: “tidak ada tindakan khusus ketika syarat tidak terpenuhi”. Program berlanjut normal ke baris berikutnya. Kalau sebuah cabang ternyata tidak pernah jalan padahal seharusnya jalan, masalahnya ada pada kondisinya — periksa operator dan nilai variabelnya dengan console.log, alat yang kita latih di section Dasar Pemrograman.

Rantai else if mampu menangani rentang nilai (>= 300000, >= 150000) maupun gabungan syarat (&&). Satu hal yang perlu dibiasakan sejak sekarang: beri nama variabel kondisi dengan kata yang menyatakan benar-salah — isMember, stokHabis, sudahBayar — sehingga kalimat if (isMember && totalBelanja >= 300000) bisa dibaca sebagai pertanyaan utuh. Untuk kasus “satu nilai yang harus dicocokkan ke daftar kemungkinan pasti” — seperti kode menu atau tombol pilihan — ada struktur yang lebih ringkas: switch, topik chapter berikutnya.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

diskon-belanja.js

Unduh berkas
javascript
// diskon-belanja.js
// Menentukan diskon dari total belanja dan status member dengan if / else if / else.

const isMember = true;
let totalBelanja = 320000;
let persenDiskon = 0;

if (isMember && totalBelanja >= 300000) {
  persenDiskon = 20;
} else if (totalBelanja >= 300000) {
  persenDiskon = 10;
} else if (totalBelanja >= 150000) {
  persenDiskon = 5;
} else {
  persenDiskon = 0;
}

console.log("Status member:", isMember);
console.log("Total belanja:", totalBelanja);
console.log("Diskon:", persenDiskon + "%");

// if tanpa else: jika kondisi tidak terpenuhi, blok ini diabaikan seluruhnya
if (totalBelanja >= 1000000) {
  console.log("Voucher spesial Rp50000 dikirim ke akun Anda");
}