Nilai Default yang Lebih Cerdas
JavaScript sejak dulu punya jalan pintas untuk nilai default: value || fallback. Biasanya berfungsi, tetapi ada bug yang sudah tertanam di dalamnya: ia menganggap nilai falsy apa pun sebagai tidak ada. 0, '', dan false semuanya memicu nilai cadangan, bahkan saat ketiganya adalah jawaban yang sebenarnya.
Operator nullish coalescing ?? memperbaikinya. Ia hanya beralih ke nilai cadangan untuk null atau undefined:
0 dan '' selamat. null dan undefined tidak. Itulah seluruh operatornya.
Mengapa || Tidak Cukup
Berikut bug klasik yang dirancang untuk dicegah oleh ??:
Pengguna meminta volume 0 (hening) dan nickname kosong. Keduanya diam-diam ditimpa karena || tidak bisa membedakan "tidak ada" dari "falsy".
Ganti dengan ??:
Sekarang 0 dan '' lolos tanpa tersentuh, dan hanya field yang benar-benar tidak ada yang mendapat nilai default. Hampir selalu inilah yang kamu inginkan.
Model Mental
?? menanyakan satu hal: apakah sisi kirinya null atau undefined? Tidak ada hal lain yang dihitung.
| Nilai kiri | left || right mengembalikan | left ?? right mengembalikan |
|---|---|---|
null | kanan | kanan |
undefined | kanan | kanan |
0 | kanan | kiri (0) |
'' | kanan | kiri ('') |
false | kanan | kiri (false) |
NaN | kanan | kiri (NaN) |
| objek apa pun | kiri | kiri |
Pilih ?? saat datamu punya nilai falsy yang bermakna. Pilih || saat kamu memang ingin menolak semua yang falsy (string pendek, hitungan nol, dan sebagainya). Kasus itu memang ada, tetapi lebih jarang daripada yang orang kira.
Short-Circuit
Seperti || dan &&, ?? melakukan short-circuit. Kalau sisi kirinya bukan nullish, sisi kanannya sama sekali tidak dijalankan:
expensiveDefault() hanya berjalan sekali, yaitu untuk b. Ini berguna saat nilai cadanganmu berupa pemanggilan fungsi, request jaringan, atau apa pun yang lebih baik dilewati kalau tidak dibutuhkan.
Berpasangan dengan Optional Chaining
?? dan ?. diperkenalkan bersama di ES2020, dan keduanya dirancang untuk bekerja sebagai tim. Optional chaining menelusuri path yang mungkin tidak ada dan menghasilkan undefined kalau ada langkah yang hilang; nullish coalescing lalu mengisi nilai default yang masuk akal:
Tanpa pasangan ini, kode yang sama menjadi rangkaian pengecekan && yang jelek atau sebuah try/catch. Dengan keduanya, akses yang aman dan nilai default yang masuk akal muat dalam satu baris.
Penugasan Nullish: ??=
a ??= b mengisi b ke a hanya saat a bernilai null atau undefined. Inilah operator logical nullish assignment, dan ia melakukan short-circuit: kalau a sudah punya nilai, sisi kanannya tidak dievaluasi.
Perhatikan bahwa verbose: false dan retries: 0 tetap dipertahankan: ??= hanya mengisi yang benar-benar tidak ada. Bandingkan dengan ||=, yang akan menimpa keduanya.
Prioritas dan Aturan Kurung
?? sengaja menolak dicampur dengan || atau && tanpa kurung. Kode ini memunculkan SyntaxError:
const x = a || b ?? c; // SyntaxError
Perancang bahasanya memutuskan bahwa urutan prioritasnya cukup ambigu sehingga layak memaksamu untuk memperjelasnya. Tambahkan kurung dan semuanya baik-baik saja:
Pengelompokan berbeda, jawaban berbeda. Kurung itu bukan hiasan: ia memberi tahu pembaca berikutnya (dan parser) apa maksudmu.
Tidak Sama dengan Parameter Default
Parameter default di signature fungsi punya aturannya sendiri: ia hanya aktif saat argumennya undefined, bukan null. Itu perbedaan halus dengan ??, yang memperlakukan keduanya sama.
Kalau kamu ingin null juga memicu nilai cadangan, pakai ?? di dalam isi fungsinya:
Perbedaan kecil, mudah tersandung saat sebuah API memberimu null untuk "belum ada nilai yang diatur".
Kapan Memakai ??
Pakai ?? sebagai operator default-mu kecuali ada alasan khusus untuk tidak memakainya. Operator inilah yang sesuai dengan perilaku kebanyakan data: 0, '', dan false biasanya adalah nilai sungguhan yang layak dipertahankan, dan hanya data yang benar-benar tidak ada yang pantas mendapat nilai cadangan. Sisakan || untuk kasus saat kamu memang ingin setiap nilai falsy diganti.
Berikutnya: Class
Itulah akhir pembahasan objek dan array: kamu sudah punya alat untuk membangun dan menelusuri bentuk data dengan aman. Bab berikutnya beralih ke cara mengatur perilaku: class, inheritance, dan sistem prototype yang ada di baliknya.
Pertanyaan yang sering diajukan
Apa itu operator nullish coalescing di JavaScript?
?? mengembalikan sisi kanannya hanya saat sisi kirinya null atau undefined. Kalau tidak, ia mengembalikan sisi kiri apa adanya. value ?? fallback adalah cara standar untuk memberi nilai default tanpa tersandung nilai yang falsy tetapi valid seperti 0 atau ''.
Apa bedanya ?? dan || di JavaScript?
|| beralih ke nilai cadangan untuk nilai falsy apa pun: 0, '', false, NaN, null, undefined. ?? hanya beralih ke nilai cadangan untuk null dan undefined. Kalau 0 atau string kosong adalah nilai yang sah di datamu, pakai ??. Kalau kamu memang ingin menolak semua nilai falsy, || tetap benar.
Bisakah nullish coalescing digabung dengan optional chaining?
Bisa, dan itu pasangan yang umum. user?.settings?.theme ?? 'light' menelusuri rangkaiannya dengan aman, menghasilkan undefined kalau ada yang hilang di sepanjang jalan, lalu menggantinya dengan 'light'. Kedua operator ini dirilis bersama di ES2020 khusus untuk mendukung pola ini.
Apa fungsi operator ??= ?
a ??= b mengisi b ke a hanya kalau a saat ini bernilai null atau undefined. Ini adalah logical nullish assignment, singkatan dari a = a ?? b, tetapi dengan short-circuit: kalau a sudah punya nilai, sisi kanannya bahkan tidak dievaluasi. Praktis untuk mengisi default yang hilang pada sebuah objek options.