Syarat gratis ongkir jarang berdiri sendiri. Toko bisa saja mensyaratkan “belanja minimal Rp100.000 dan member aktif”, atau sebaliknya memberi kelonggaran “member aktif atau belanja minimal Rp100.000”. Kata penghubung seperti itu adalah pekerjaan operator logika: menggabungkan beberapa hasil perbandingan menjadi satu keputusan.
Tiga operator yang kita bahas adalah && (AND), || (OR), dan ! (NOT). Yang membuat ketiganya menarik di JavaScript: selain mengolah boolean, && dan || ternyata mengembalikan nilai operand-nya sendiri — perilaku yang tidak selalu dijelaskan di bahasa lain dan yang akan kita buktikan langsung. Perilaku itu juga menjadi fondasi pola short-circuit yang sangat sering dipakai sebagai penjaga (guard) sebelum mengakses properti.
Tiga Operator Logika #
| Operator | Nama | Contoh | Hasil |
|---|---|---|---|
&& | AND (dan) | true && false | false |
|| | OR (atau) | true || false | true |
! | NOT (bukan) | !true | false |
Aturan dasarnya sederhana. && menghasilkan true hanya jika kedua operand benar. || menghasilkan true jika salah satu operand benar. ! membalik kebenaran satu nilai. Namun aturan ini baru setengah cerita; setengah lainnya — nilai apa yang sebenarnya dikembalikan — kita uji pada contoh utama.
Contoh: Syarat Gratis Ongkir #
Berkas berikut menggabungkan syarat belanja Budi. Kita sengaja mencetak hasil && dan || pada operand yang bukan boolean, agar perilaku aslinya terlihat:
// logika-pesanan.js
// Menggabungkan syarat pesanan dan membuktikan nilai kembalian && dan ||.
const totalBelanja = 150000;
const memberAktif = true;
// && : kedua syarat harus benar agar dapat gratis ongkir.
console.log(totalBelanja >= 100000 && memberAktif);
// && mengembalikan nilai operand, bukan selalu boolean.
console.log("kopi" && "gula");
console.log(0 && "gula");
// || mengembalikan operand pertama yang benar (truthy).
console.log(0 || "belum ada catatan");
console.log("catatan tersimpan" || "belum ada catatan");
// ! membalik kebenaran dan selalu menghasilkan boolean.
console.log(!memberAktif);
console.log(!"teks tidak kosong");
// Guard: properti hanya dibaca jika pesanan benar-benar ada.
const pesanan = { harga: 45000 }; // object paling sederhana: satu kunci, satu nilai
console.log(pesanan !== undefined && pesanan.harga > 0);
const draftPesanan = undefined;
console.log(draftPesanan !== undefined && draftPesanan.harga > 0);Output yang Dihasilkan:
true
gula
0
belum ada catatan
catatan tersimpan
false
false
true
falseMari kita telaah baris-baris pentingnya:
- Baris 4–5 (
const totalBelanja = 150000;dst.): dua data syarat disiapkan — angka belanja dan status member. - Baris 8 (
console.log(totalBelanja >= 100000 && memberAktif);): perbandingan150000 >= 100000menghasilkantrue, lalutrue && truejugatrue. Kedua syarat terpenuhi, sehingga keluaran pertama adalahtrue. - Baris 11 (
console.log("kopi" && "gula");): inilah bukti pertama bahwa&&tidak selalu mengembalikan boolean. Kedua operand berupa string (yang tidak kosong dianggap benar), dan hasilnya adalah operand kedua,"gula". - Baris 12 (
console.log(0 && "gula");):0dianggap salah (falsy), sehingga&&berhenti dan mengembalikan operand pertama apa adanya:0. - Baris 15–16 (
0 || "belum ada catatan"dst.):||bekerja cermin dari&&. Operand pertama yang dianggap benar dikembalikan; jika operand pertama0(salah), operand kedua"belum ada catatan"yang dikembalikan. Begitu operand pertama sudah benar —"catatan tersimpan"— operand kedua tidak lagi diperhatikan. - Baris 19–20 (
!memberAktifdan!"teks tidak kosong"):!membaliktruemenjadifalse, dan string tak kosong (dianggap benar) menjadifalse. Tidak seperti&&dan||, hasil!selalu boolean. - Baris 23–24 (
const pesanan = ...danconsole.log(...)):pesananadalah object paling sederhana — wadah dengan kuncihargabernilai45000. (Object dibahas penuh di section Objects; bentuk seperti ini cukup untuk contoh kita.) Ekspresipesanan !== undefined && pesanan.harga > 0menghasilkantrue. - Baris 26–27 (
const draftPesanan = undefined;dst.):draftPesananmemang tidak ada isinya, tetapi program tetap berjalan dan mencetakfalse. Tidak ada error — karena operand keduadraftPesanan.harga > 0tidak pernah dieksekusi.
Short-Circuit Evaluation #
Perilaku pada butir 4, 5, dan 8 di atas punya nama: short-circuit evaluation. Engine mengevaluasi operand dari kiri, dan begitu hasil akhir sudah pasti, sisa ekspresi tidak dieksekusi sama sekali. Untuk &&, begitu operand kiri dianggap salah, hasil pasti salah — operand kanan dilewati. Untuk ||, begitu operand kiri dianggap benar, hasil pasti benar — operand kanan dilewati.
Rumus nilai kembalian keduanya bisa dirangkum begini: a && b mengembalikan a bila a dianggap salah, atau mengembalikan b bila a dianggap benar; a || b mengembalikan a bila a dianggap benar, atau mengembalikan b bila a dianggap salah. Ingat kembali daftar nilai falsy dari section Values dan Types: false, 0, "", null, undefined, dan NaN — nilai-nilai itulah yang dianggap salah oleh kedua operator.
Guard: Penjaga Sebelum Akses Properti #
Baris 27 pada contoh utama menunjukkan pola yang akan terus kita pakai, disebut guard: periksa keberadaan dulu, baru akses isinya. Tanpa penjaga itu, program akan berhenti dengan error. Kita buktikan dengan menghapus guard-nya:
const draftPesanan = undefined;
console.log(draftPesanan.harga > 0);Output yang Dihasilkan:
TypeError: Cannot read properties of undefined (reading 'harga')Pesan di atas adalah inti transkrip error dari node: program berhenti di baris kedua karena engine mencoba membaca properti harga dari undefined. Dengan guard draftPesanan !== undefined && ..., pembacaan itu tidak pernah terjadi, dan program aman melanjutkan eksekusi.
Guard juga tetap berguna ketika data ada tetapi isinya belum memenuhi syarat. Bandingkan dengan kasus keranjang yang memang ada, hanya saja totalnya nol:
const keranjang = { total: 0 };
console.log(keranjang !== undefined && keranjang.total > 0);Output yang Dihasilkan:
falseHasilnya tetap false, tetapi maknanya berbeda dari kasus sebelumnya: keranjang ada (operand pertama lolos), lalu pemeriksaan kedua keranjang.total > 0 dievaluasi dan gagal. Dua keadaan — “tidak ada” dan “ada tetapi tidak memenuhi syarat” — sama-sama menghasilkan false, dan keduanya ditangani satu ekspresi yang sama tanpa risiko error.
Dengan tiga operator logika ini, syarat-syarat nyata — rentang nilai, keanggotaan, kelengkapan data — kini bisa kita rumuskan. Tantangan berikutnya: bagaimana menuliskan hasil perhitungan berulang, seperti stok = stok + 25, dengan lebih ringkas. Topik itu menanti di chapter Assignment Operators.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
logika-pesanan.js
Unduh berkas// logika-pesanan.js
// Menggabungkan syarat pesanan dan membuktikan nilai kembalian && dan ||.
const totalBelanja = 150000;
const memberAktif = true;
// && : kedua syarat harus benar agar dapat gratis ongkir.
console.log(totalBelanja >= 100000 && memberAktif);
// && mengembalikan nilai operand, bukan selalu boolean.
console.log("kopi" && "gula");
console.log(0 && "gula");
// || mengembalikan operand pertama yang benar (truthy).
console.log(0 || "belum ada catatan");
console.log("catatan tersimpan" || "belum ada catatan");
// ! membalik kebenaran dan selalu menghasilkan boolean.
console.log(!memberAktif);
console.log(!"teks tidak kosong");
// Guard: properti hanya dibaca jika pesanan benar-benar ada.
const pesanan = { harga: 45000 }; // object paling sederhana: satu kunci, satu nilai
console.log(pesanan !== undefined && pesanan.harga > 0);
const draftPesanan = undefined;
console.log(draftPesanan !== undefined && draftPesanan.harga > 0);