Kenapa ini penting
Ekspresi adalah potongan kode yang menghasilkan sebuah nilai. 2 + 3 adalah ekspresi yang menghasilkan 5. umur >= 17 adalah ekspresi yang menghasilkan true atau false. Seluruh logika program, mulai dari menghitung total belanja, mengecek apakah pengguna sudah login, sampai memilih harga diskon, dibangun dari ekspresi dan operator. JavaScript punya beberapa operator yang perilakunya mengejutkan bagi pemula, terutama == yang suka mengonversi tipe diam-diam dan || yang menganggap angka 0 sebagai "tidak ada". Modul ini membekalimu dengan versi yang aman: ===, ??, dan ?..
Konsep inti
Operator aritmatika
| Operator | Arti | Contoh | Hasil |
|---|---|---|---|
+ |
Tambah (atau gabung string) | 7 + 2 |
9 |
- |
Kurang | 7 - 2 |
5 |
* |
Kali | 7 * 2 |
14 |
/ |
Bagi | 7 / 2 |
3.5 |
% |
Sisa bagi (modulus) | 7 % 2 |
1 |
** |
Pangkat | 2 ** 3 |
8 |
++ / -- |
Tambah/kurang 1 | x++ |
Urutan operasi mengikuti matematika: pangkat dulu, lalu kali/bagi/modulus, lalu tambah/kurang. Kalau ragu, pakai kurung ( ).
Jebakan + dengan string: kalau salah satu operand adalah string, + menggabungkan teks. "5" + 3 menghasilkan "53". Operator lain (-, *, /) justru mengubah string ke number: "5" - 3 menghasilkan 2. Ketidakkonsistenan ini alasan kenapa input harus dikonversi secara eksplisit.
Assignment gabungan: x += 5 sama dengan x = x + 5. Ada juga -=, *=, /=, %=, **=.
Operator perbandingan: == vs ===
| Operator | Arti |
|---|---|
=== |
Sama nilai dan sama tipe (strict equality) |
!== |
Tidak sama (strict) |
== |
Sama nilai setelah konversi tipe otomatis (loose equality) |
!= |
Tidak sama (loose) |
>, <, >=, <= |
Lebih besar, lebih kecil, dan seterusnya |
== melakukan type coercion (konversi diam-diam) sebelum membandingkan, sehingga hasilnya sering tidak terduga:
| Ekspresi | == |
=== |
|---|---|---|
5 dan "5" |
true |
false |
0 dan false |
true |
false |
"" dan 0 |
true |
false |
null dan undefined |
true |
false |
[] dan false |
true |
false |
Aturan praktis: selalu pakai === dan !==. Satu-satunya pemakaian == yang kadang dianggap wajar adalah x == null untuk mengecek null atau undefined sekaligus, tapi operator ?? biasanya lebih jelas untuk kasus itu.
Operator logika
| Operator | Nama | Hasil |
|---|---|---|
&& |
AND | Benar kalau kedua sisi benar |
\|\| |
OR | Benar kalau salah satu sisi benar |
! |
NOT | Membalik nilai: !true menjadi false |
Dua sifat penting:
- Short-circuit:
&&berhenti di nilai falsy pertama,||berhenti di nilai truthy pertama. Sisi kanan tidak dievaluasi kalau tidak perlu. - Mengembalikan salah satu operand, bukan selalu boolean.
"Budi" || "Tamu"menghasilkan"Budi".0 || 10menghasilkan10.
(Truthy dan falsy dibahas lengkap di modul berikutnya. Singkatnya, nilai falsy adalah false, 0, "", null, undefined, NaN, dan sejenisnya.)
Ternary: if-else dalam satu ekspresi
kondisi ? nilaiJikaBenar : nilaiJikaSalah
Cocok untuk memilih satu dari dua nilai. Contoh: const status = umur >= 17 ? "dewasa" : "anak". Jangan disusun bertingkat terlalu dalam karena sulit dibaca.
Nullish coalescing ??
a ?? b menghasilkan b hanya kalau a adalah null atau undefined. Bedanya dengan ||:
| Ekspresi | \|\| |
?? |
|---|---|---|
0 dengan default 10 |
10 |
0 |
"" dengan default "anon" |
"anon" |
"" |
null dengan default 10 |
10 |
10 |
undefined dengan default 10 |
10 |
10 |
Gunakan ?? untuk nilai default ketika 0, "", atau false adalah nilai yang sah. Contohnya stok 0, diskon 0, atau volume 0.
Optional chaining ?.
Mengakses properti dari null atau undefined menghasilkan error: TypeError: Cannot read properties of undefined. Operator ?. menghentikan akses dengan aman dan menghasilkan undefined:
user?.alamat?.kotauntuk properti.daftar?.[0]untuk index array.obj.method?.()untuk memanggil method yang belum tentu ada.
Gabungan yang sering dipakai: user?.alamat?.kota ?? "Kota tidak diketahui".
Contoh kode
// Aritmatika
console.log(7 / 2, 7 % 2, 2 ** 10); // → 3.5 1 1024
console.log(2 + 3 * 4, (2 + 3) * 4); // → 14 20
// Jebakan string
console.log("5" + 3); // → 53 (string)
console.log("5" - 3); // → 2 (number)
console.log("5" * "2"); // → 10
console.log(1 + 2 + "3"); // → 33 (1+2=3 dulu, lalu digabung "3")
console.log("1" + 2 + 3); // → 123
// Assignment gabungan dan increment
let poin = 10;
poin += 5; // 15
poin *= 2; // 30
poin++; // 31
console.log(poin); // → 31
// == vs ===
console.log(5 == "5", 5 === "5"); // → true false
console.log(0 == false, 0 === false); // → true false
console.log(null == undefined, null === undefined); // → true false
// Logika dan short-circuit
const login = true;
const admin = false;
console.log(login && admin); // → false
console.log(login || admin); // → true
console.log(!login); // → false
console.log("Budi" || "Tamu"); // → Budi
console.log("" || "Tamu"); // → Tamu
console.log(login && "Selamat datang"); // → Selamat datang
Ternary, ??, dan ?.:
// Ternary
const nilai = 72;
const hasil = nilai >= 75 ? "Lulus" : "Remedial";
console.log(hasil); // → Remedial
// ?? vs ||
const stok = 0;
console.log(stok || "Tidak tersedia"); // → Tidak tersedia (salah! stok 0 itu sah)
console.log(stok ?? "Tidak tersedia"); // → 0 (benar)
const pengaturan = { volume: 0, tema: null };
const volume = pengaturan.volume ?? 50;
const tema = pengaturan.tema ?? "terang";
console.log(volume, tema); // → 0 terang
// Optional chaining
const user = { nama: "Dina", alamat: null };
// console.log(user.alamat.kota); // → TypeError: Cannot read properties of null (reading 'kota')
console.log(user.alamat?.kota); // → undefined
console.log(user.alamat?.kota ?? "Belum diisi"); // → Belum diisi
const pesanan = { item: [{ nama: "Kopi" }] };
console.log(pesanan.item?.[0]?.nama); // → Kopi
console.log(pesanan.item?.[5]?.nama); // → undefined
console.log(user.sapa?.()); // → undefined (method tidak ada, tidak error)
Kesalahan umum
- Memakai
==alih-alih===."0" == falsebernilaitrue, padahal jelas berbeda. Biasakan===di mana-mana. - Menjumlahkan input tanpa konversi.
"10" + 5menghasilkan"105". Konversi dulu denganNumber(). - Memakai
||untuk default ketika 0 atau string kosong itu sah. Gunakan??. - Menyusun ternary bertingkat-tingkat.
a ? b : c ? d : e ? f : gsulit dibaca. Untuk lebih dari dua pilihan, pakaiif/elseatauswitch. - Menaburkan
?.di mana-mana. Pakai hanya untuk data yang memang boleh tidak ada. Kalau sebuah data wajib ada, lebih baik error muncul sejak awal supaya bug cepat ketahuan.
Latihan
- Mudah, Hitung luas dan keliling lingkaran berjari-jari 7 (pakai
Math.PI), lalu tampilkan dengan 2 angka di belakang koma. - Sedang, Buat ekspresi yang menentukan apakah sebuah tahun adalah tahun kabisat: habis dibagi 4 dan tidak habis dibagi 100, atau habis dibagi 400. Uji dengan 2024, 1900, 2000, dan 2026.
- Menantang, Diberikan
const data = { profil: { nama: "Eko", diskon: 0 } }danconst kosong = {}. Buat functioninfoDiskon(obj)yang mengembalikan"Eko dapat diskon 0%"untukdatadan"Tamu dapat diskon 5%"untukkosong. Gunakan?.dan??.
Lihat solusi
1.
const r = 7;
const luas = Math.PI * r ** 2;
const keliling = 2 * Math.PI * r;
console.log(luas.toFixed(2), keliling.toFixed(2)); // → 153.94 43.98
2.
for (const tahun of [2024, 1900, 2000, 2026]) {
const kabisat = (tahun % 4 === 0 && tahun % 100 !== 0) || tahun % 400 === 0;
console.log(tahun, kabisat);
}
// → 2024 true
// → 1900 false
// → 2000 true
// → 2026 false
3.
function infoDiskon(obj) {
const nama = obj?.profil?.nama ?? "Tamu";
const diskon = obj?.profil?.diskon ?? 5;
return `${nama} dapat diskon ${diskon}%`;
}
const data = { profil: { nama: "Eko", diskon: 0 } };
const kosong = {};
console.log(infoDiskon(data)); // → Eko dapat diskon 0%
console.log(infoDiskon(kosong)); // → Tamu dapat diskon 5%
Kalau memakai ||, diskon Eko yang sah 0 akan berubah menjadi 5.
Ringkasan
- Ekspresi menghasilkan nilai. Operator aritmatika:
+ - * / % **. Waspadai+yang menggabungkan string. - Selalu pakai
===/!==.==melakukan konversi tipe diam-diam. &&,||,!bersifat short-circuit dan mengembalikan salah satu operand.- Ternary
k ? a : bmemilih satu dari dua nilai dalam satu ekspresi. ??memberi default hanya untuknull/undefined.?.mengakses properti dengan aman.