Operator adalah cara ekspresi bekerja
Setiap baris JavaScript yang tidak sepele dibangun dari operator, yaitu simbol yang mengambil satu atau dua nilai lalu menghasilkan nilai baru. + menjumlahkan, === membandingkan, && menggabungkan boolean, ? : memilih di antara dua nilai. Sebagian besar sudah familier dari bahasa lain; segelintir punya keanehan khas JavaScript yang sebaiknya kamu ketahui sejak awal.
Kita akan membahasnya per kategori, dan diakhiri dengan operator yang paling jarang kamu pakai tapi tetap penting saat dibutuhkan.
Operator aritmetika
Operator dasarnya berperilaku seperti yang kamu harapkan:
Beberapa hal yang perlu diperhatikan:
/selalu melakukan pembagian floating-point.7 / 2hasilnya3.5, bukan3. PakaiMath.floor(7 / 2)atauMath.trunc(7 / 2)kalau kamu ingin bilangan bulat.%adalah sisa bagi, bukan modulo matematika yang sebenarnya. Ia mempertahankan tanda operand kiri:-7 % 3hasilnya-1, bukan2.+punya dua arti. Kalau salah satu sisinya string, ia menyambung string alih-alih menjumlahkan:"3" + 1hasilnya"31". Penjelasan lebih lanjut sebentar lagi.
Increment dan decrement
Perbedaan count++ dan ++count hanya berpengaruh saat kamu memakai nilai ekspresinya di baris yang sama. Sebagai pernyataan yang berdiri sendiri, keduanya melakukan hal yang sama. Kebanyakan panduan gaya lebih menyukai count += 1 karena lebih jelas.
Operator + punya dua kepribadian
Yang satu ini menjebak semua orang setidaknya sekali:
Kalau salah satu operand berupa string, + menjadi penyambung string dan mengonversi sisi lainnya menjadi string. Semua operator aritmetika lain bekerja ke arah sebaliknya: mereka mengonversi string menjadi angka:
Pelajarannya: saat menyusun string, utamakan template literal (`price: ${5}`). Saat berhitung, pastikan input-mu benar-benar angka: Number(x) atau parseInt(x, 10) mengonversinya secara eksplisit.
Operator perbandingan
Perbandingan menghasilkan boolean. Ada dua jenis: strict dan loose.
=== dan !== bersifat strict: nilai dan tipenya harus sama. == dan != mengonversi tipe sebelum membandingkan, yang menimbulkan kejutan seperti null == undefined bernilai true atau [] == false bernilai true. Pakai === dan !== sebagai default. Satu-satunya pengecualian yang umum adalah x == null, jalan pintas praktis untuk "apakah x bernilai null atau undefined?"
Operator urutan bekerja seperti yang kamu harapkan pada angka, dan secara alfabetis pada string:
Perbandingan string didasarkan pada kode karakter, jadi bersifat case-sensitive. Kalau kamu butuh pengurutan yang ramah manusia, pakai String.prototype.localeCompare.
Operator logika
&& (AND), || (OR), dan ! (NOT) menggabungkan boolean, tapi perilakunya lebih menarik daripada aljabar boolean murni.
Uniknya: && dan || tidak menghasilkan true atau false. Mereka mengembalikan salah satu operand-nya. && mengembalikan nilai falsy pertama, atau nilai terakhir kalau semuanya truthy. || mengembalikan nilai truthy pertama, atau nilai terakhir kalau semuanya falsy.
Itulah kenapa kamu akan melihat pola seperti const displayName = user.name || "Guest": ambil hal pertama yang tidak kosong. Ringkas, tapi hati-hati: || menganggap 0, "", dan false sebagai pemicu nilai cadangan. Kalau nilai-nilai itu sah untukmu, pakai ?? (dibahas di bawah).
Kedua operator ini juga melakukan short-circuit: kalau sisi kiri sudah menentukan jawabannya, sisi kanan tidak pernah dijalankan.
Operator nullish coalescing ??
?? mirip ||, tapi hanya terpicu oleh null atau undefined, bukan oleh 0, "", atau false.
Pakai ?? saat nilai yang sah bisa saja falsy: hitungan, string kosong, false yang disengaja. Pakai || saat semua nilai falsy berarti "tidak ada." Dalam kode modern, ?? adalah default yang lebih aman untuk nilai opsional dengan default yang tidak null.
Operator assignment
= melakukan assignment. Bentuk gabungannya menyatukan assignment dengan operator lain:
Ada juga operator logical assignment, yaitu ||=, &&=, dan ??=, yang hanya melakukan assignment kalau nilai saat ini memenuhi suatu kondisi:
Operator ini praktis untuk mengisi nilai default tanpa pernyataan if yang bertele-tele.
Operator ternary
condition ? a : b adalah versi ekspresi dari if/else. Ia mengembalikan a saat kondisinya truthy, dan b kalau tidak:
Ternary unggul untuk memilih nilai secara singkat. Begitu bersarang, ia langsung sulit dibaca. Kalau kamu mendapati dirimu menulis a ? b : c ? d : e, beralihlah ke if/else atau lookup object.
typeof dan instanceof
typeof mengembalikan string yang menjelaskan tipe operand-nya:
Dua jebakan yang perlu diingat: typeof null hasilnya "object" (bug dari tahun 1995 yang kini permanen), dan array juga melaporkan "object". Pakai Array.isArray(x) untuk array dan x === null untuk null.
instanceof mengecek apakah sebuah object dibuat dari constructor tertentu:
Spread dan rest memakai ... yang sama
Kamu akan melihat ... di dua tempat. Sebagai spread, ia membentangkan iterable menjadi elemen-elemen terpisah:
Sebagai rest, ia mengumpulkan beberapa nilai ke dalam satu array, biasanya di parameter fungsi atau destructuring:
Sintaksnya sama, tugasnya berlawanan. Spread membongkar; rest mengumpulkan. Mana yang mana ditentukan oleh konteks: di pemanggilan fungsi atau literal, ia melakukan spread; di daftar parameter atau pola destructuring, ia mengumpulkan.
Operator precedence (kalau ragu, pakai tanda kurung)
Operator punya urutan prioritas yang menentukan mana yang dijalankan lebih dulu saat kamu mencampurnya. Perkalian mengalahkan penjumlahan, perbandingan mengalahkan logika, dan seterusnya:
Tabel lengkapnya panjang, dan tidak ada yang hafal semuanya. Satu kebiasaan sederhana sudah mencakup 99% kasus: saat kamu mencampur operator dan tidak yakin urutannya, tambahkan tanda kurung. Kodenya jadi lebih mudah dibaca dan tidak bergantung pada ingatan pembacanya.
Operator bitwise (jarang yang kamu butuhkan)
Supaya lengkap: &, |, ^, ~, <<, >>, dan >>> bekerja pada representasi biner bilangan bulat. Kamu akan melihatnya di kode grafis, protokol tingkat rendah, dan sesekali di API yang memakai bitmask flag.
Satu trik yang umum tapi patut dipertanyakan: n | 0 memotong angka menjadi bilangan bulat 32-bit, yang dulu sering disalahgunakan sebagai Math.trunc yang lebih cepat. Jangan lakukan itu: Math.trunc lebih jelas dan berfungsi untuk angka di luar rentang 32-bit.
Berikutnya: if/else
Operator menghasilkan nilai; if/else memakai nilai itu untuk memilih cabang kode yang akan dijalankan. Sebagian besar yang akan kamu lakukan dengan operator perbandingan dan logika di atas adalah memasukkan hasilnya ke percabangan, dan itulah topik halaman berikutnya.
Pertanyaan yang sering diajukan
Apa saja operator utama di JavaScript?
JavaScript punya operator aritmetika (+, -, *, /, %, **), perbandingan (===, !==, <, >), logika (&&, ||, !), assignment (=, +=, -=), dan beberapa operator khusus seperti ternary ? :, typeof, dan nullish coalescing ??. Semuanya adalah balok bangunan untuk ekspresi dan alur kontrol.
Apa bedanya == dan === di JavaScript?
=== mengecek bahwa nilai dan tipenya sama. == mengonversi tipe sebelum membandingkan, jadi 0 == "0" bernilai true sedangkan 0 === "0" bernilai false. Pakai === sebagai default: aturan konversi == cukup halus untuk menimbulkan bug yang tidak akan terlihat saat review.
Apa fungsi operator ternary di JavaScript?
condition ? a : b adalah if/else satu baris yang menghasilkan nilai. Kalau condition truthy, hasilnya a, kalau tidak b. Operator ini berguna untuk ekspresi kondisional pendek seperti const label = count === 1 ? 'item' : 'items', tapi ternary bersarang cepat sekali menjadi sulit dibaca.
Kapan sebaiknya memakai ?? alih-alih ||?
|| beralih ke nilai cadangan untuk nilai falsy apa pun, termasuk 0, "", dan false. ?? hanya beralih untuk null atau undefined. Kalau kamu ingin count ?? 10 tetap mempertahankan 0 yang sah, pakai ??. Kalau kamu memang ingin semua nilai falsy memicu nilai cadangan, tetap pakai ||.