Operator dan ekspresi

Operator aritmetika, logika, ternary, dan pratayang optional chaining.

Daftar isi

Ekspresi adalah kode yang menghasilkan sebuah nilai, dan operator adalah simbol yang menggabungkan nilai-nilai menjadi ekspresi baru. Topik ini menelusuri operator yang paling sering dipakai sehari-hari, mulai dari aritmetika, increment dan decrement yang menaikkan serta menurunkan nilai satu per satu, operator logika dengan short-circuit, sampai operator ternary dan penggabungan string. Satu pratayang optional chaining juga disertakan sebagai pengantar menuju modul object dan array. Semua contoh dapat dijalankan dengan Node.js dan keluarannya ditampilkan apa adanya.

Operator aritmetika#

Operator aritmetika JavaScript mencakup penjumlahan, pengurangan, perkalian, pembagian, sisa pembagian, dan perpangkatan, ditambah tanda minus untuk nilai negatif. Empat yang pertama berperilaku seperti matematika biasa. Operator % menghasilkan sisa pembagian, bukan hasil baginya, dan operator ** menghitung perpangkatan. Contoh berikut menjalankan semuanya sekali agar keluarannya dapat dilihat sekaligus.

js Contoh: enam operator aritmetika
console.log(7 + 3);
console.log(7 - 3);
console.log(7 * 3);
console.log(7 / 2);
console.log(7 % 2);
console.log(2 ** 10);
text Keluaran
10
4
21
3.5
1
1024

Baris 7 % 2 menghasilkan 1 karena 7 dibagi 2 bersisa 1, sedangkan 2 ** 10 menghasilkan 1024 dari dua pangkat sepuluh. Operator % sering dipakai untuk memeriksa habis dibagi, misalnya menentukan bilangan genap dengan nilai sisa 0, dan pola itu muncul terus dalam perulangan. Pembagian 7 / 2 menghasilkan 3.5 dan bukan bilangan bulat yang dipotong, karena seluruh pembagian di JavaScript bekerja pada tipe number tanpa pembedaan bulat dan desimal. Keluaran tipe number yang aneh seperti 0.30000000000000004 sudah dibahas pada topik Tipe data dan berlaku penuh di sini.

Increment dan decrement#

Operator increment ++ menaikkan nilai satu, sedangkan decrement -- menurunkannya satu. Keduanya adalah singkatan dari penugasan ulang yang sama, yaitu stok = stok + 1 dan stok = stok - 1. Posisi operatornya menentukan kapan nilai baru terbaca, dan perbedaannya terlihat pada contoh berikut.

js Contoh: increment postfix
let stok = 10;
stok++;
console.log(stok);
stok--;
console.log(stok);

const sekarang = stok++;
console.log("sekarang:", sekarang, "stok:", stok);
text Keluaran
11
10
sekarang: 10 stok: 11

Bentuk stok++ yang ditulis setelah variabel disebut bentuk postfix. Pada bentuk ini, ekspresi memakai nilai lama terlebih dahulu, baru kenaikan terjadi, sehingga sekarang berisi 10 sementara stok menjadi 11. Bentuk ++stok yang ditulis sebelum variabel menaikkan nilainya lebih dahulu, sehingga nilai baru itulah yang terbaca. Dalam kode yang sederhana, menuliskan penugasan biasa sering lebih jelas daripada menumpuk keduanya dalam satu ekspresi. Gaya ini sekaligus menghindari kebingungan saat kode dibaca ulang beberapa bulan kemudian.

Operator logika dan short-circuit#

Tiga operator logika mengolah nilai boolean, yaitu && untuk dan, || untuk atau, serta ! untuk pembalikan. Perilaku menariknya adalah short-circuit, yaitu sisi kanan tidak dieksekusi bila hasil sudah pasti dari sisi kiri. Selain boolean, && dan || juga mengembalikan salah satu operannya, bukan selalu true atau false.

js Contoh: &&, ||, dan !
console.log(true && "aktif");
console.log(false && "aktif");
console.log(null || "nilai cadangan");
console.log("terisi" || "nilai cadangan");
console.log(!true);
text Keluaran
aktif
false
nilai cadangan
terisi
false

Ekspresi true && "aktif" mengembalikan operan kanannya karena sisi kiri sudah pasti benar, sedangkan false && "aktif" langsung mengembalikan false tanpa melihat kanan. Pada ||, nilai cadangan “nilai cadangan” muncul hanya karena sisi kirinya bernilai falsy, dan daftar nilai falsy pada topik Koersi tipe berlaku persis di sini. Pola semacam ini dipakai untuk memberi nilai bawaan atau menjaga pemanggilan fungsi yang mahal. Contoh berikut menunjukkan sisi kanan yang benar-benar tidak berjalan.

js Contoh: sisi kanan tidak dieksekusi
function periksaBerkas() {
  console.log("fungsi periksaBerkas() dijalankan");
  return true;
}

const siapKirim = false && periksaBerkas();
console.log("siapKirim =", siapKirim);
text Keluaran
siapKirim = false

Fungsi periksaBerkas() tidak pernah dijalankan karena sisi kiri bernilai false dan hasilnya sudah pasti, sehingga pesannya tidak pernah muncul di keluaran. Short-circuit bukan optimasi tersembunyi, melainkan aturan evaluasi yang dijamin spesifikasi bahasa. Karena itu pola ini aman dipakai untuk menjaga kode yang menimbulkan efek samping, misalnya pemanggilan fungsi yang hanya boleh berjalan pada kondisi tertentu.

Ternary#

Operator ternary membentuk ekspresi dari tiga bagian, yaitu kondisi, nilai ketika kondisinya benar, dan nilai ketika kondisinya salah, dengan bentuk kondisi ? nilaiA : nilaiB. Ternary menggabungkan if dan else menjadi satu ekspresi, sehingga hasilnya dapat langsung disimpan ke variabel. Percabangan penuh dibahas pada modul alur kendali, sementara di sini cukup dua contoh ringkas.

js Contoh: ternary untuk memilih nilai
const nilai = 75;
const hasil = nilai >= 75 ? "lulus" : "remedial";
console.log(hasil);

const poin = 0;
const tampil = poin !== 0 ? poin : "belum ada poin";
console.log(tampil);
text Keluaran
lulus
belum ada poin

Baris pertama keluaran berasal dari kondisi nilai >= 75 yang benar, sedangkan baris kedua menunjukkan peran ternary dalam menangani nilai falsy, karena poin bernilai 0 ditampilkan sebagai teks penjelasan, bukan sebagai angka 0. Ternary paling nyaman untuk memilih di antara dua nilai dalam satu baris. Untuk kondisi yang bertingkat, if dan else jauh lebih mudah dibaca daripada ternary bersarang. Memilih bentuk yang paling jelas untuk dibaca adalah aturan yang berlaku di sini.

Gabungan string dan pratayang optional chaining#

Operator + menggabungkan string ketika salah satu sisinya string, dan inilah cara paling lama untuk merakit teks dari beberapa bagian. Contoh berikut menyusun satu nama lengkap dari dua string dan pemisah spasi.

js Contoh: penggabungan string dengan +
const depan = "Ali";
const belakang = "Ramdan";
console.log("Nama lengkap: " + depan + " " + belakang);
text Keluaran
Nama lengkap: Ali Ramdan

Penggabungan dengan + masih banyak dipakai dan tetap sah, sedangkan template literal pada topik String dan template literal menyediakan cara yang lebih rapi untuk pola semacam ini. Satu operator lain layak dikenalkan sejak sekarang karena sering muncul di kode modern. Optional chaining ditulis ?., yaitu operator yang mengembalikan undefined alih-alih menghentikan program ketika jalur properti yang diminta tidak ada. Contoh singkat berikut cukup untuk mengenalinya, dan pembahasan lengkapnya ada pada modul object dan array.

js Contoh: optional chaining ?.
const karya = { judul: "Catatan kecil", penulis: { nama: "Dewi" } };
const karyaAnonim = { judul: "Tanpa judul" };

console.log(karya.penulis?.nama);
console.log(karyaAnonim.penulis?.nama);
text Keluaran
Dewi
undefined

Baris kedua menghasilkan undefined karena karyaAnonim tidak memiliki properti penulis, dan tanpa ?. baris yang sama akan berhenti dengan pesan error. Pratayang sebatas ini yang dibutuhkan sekarang, sedangkan variasi dan jebakannya dibahas pada modul object dan array. Sementara itu, sisa operator JavaScript lain tidak perlu dihafal sekarang. Daftar di atas sudah menutup kebutuhan membaca kode pada seluruh modul dasar bahasa ini.

Ringkasan#

  • Operator aritmetika mencakup +, -, *, /, % untuk sisa bagi, dan ** untuk perpangkatan.
  • ++ dan -- menaikkan atau menurunkan satu, dan posisi operator menentukan nilai yang terbaca.
  • && dan || mengembalikan salah satu operannya dengan short-circuit, sehingga sisi kanan boleh tidak dieksekusi.
  • Ternary memilih antara dua nilai dalam satu ekspresi, dan ?. mengembalikan undefined untuk jalur properti yang tidak ada.

Referensi#