Destructuring Adalah Pencocokan Pola pada Bentuk
Destructuring memungkinkanmu menulis pola yang mencerminkan bentuk sebuah objek atau array, lalu mengambil nilai berdasarkan nama atau posisi dalam satu baris, mirip unpacking di Python. Alih-alih mengambil isi sebuah nilai property demi property, kamu menjelaskan apa yang kamu mau dan JavaScript menyerahkannya.
Dua jenisnya:
Kurung kurawal mencocokkan objek berdasarkan nama property. Kurung siku mencocokkan array berdasarkan posisi. Dalam kedua kasus, variabel di sisi kiri adalah deklarasi baru: kamu tidak sedang mengakses index nilainya, melainkan menjelaskan sebuah pola yang mengekstrak bagian-bagiannya.
Sebelum destructuring ada, kode yang sama terlihat seperti ini:
const name = user.name;
const age = user.age;
const first = scores[0];
const second = scores[1];
Bukan masalah besar, tetapi jadi berulang-ulang kalau kamu melakukannya di setiap fungsi.
Destructuring Objek Memakai Nama Property
Untuk objek, nama di dalam kurung kurawal harus cocok dengan nama property pada sumbernya. Urutannya tidak penting, karena JavaScript mencarinya berdasarkan key.
Kalau sebuah property tidak ada di objek, variabelnya bernilai undefined, tanpa error:
Perilaku undefined yang diam-diam ini penting diingat saat salah ketik nama property membuatmu bingung tengah malam.
Mengganti Nama Variabel
Kadang nama property di objek bukan nama yang kamu inginkan untuk variabelnya, mungkin karena bentrok dengan sesuatu di scope, atau API-nya memakai konvensi penamaan yang tidak kamu sukai. Pakai original: newName untuk mengikat ulang:
Bacalah sebagai "ambil property id, beri nama userId." Nama property ditulis lebih dulu, nama variabel baru setelah titik dua. Bentuknya mirip anotasi tipe di bahasa lain, padahal bukan.
Nilai Default
Kalau sebuah property mungkin tidak ada, beri nilai default langsung di polanya:
Default hanya berlaku saat nilainya undefined. null, 0, dan "" semuanya diteruskan apa adanya:
Yang satu itu sering menjebak. Kalau kamu ingin null juga memicu default, kamu butuh pengecekan eksplisit, atau pakai operator nullish coalescing ?? setelah destructuring.
Kamu bisa menggabungkan default dengan penggantian nama:
Destructuring Array Memakai Posisi
Array tidak punya nama, hanya index, jadi polanya mencocokkan berdasarkan posisi. Pakai koma untuk melewati elemen yang tidak kamu perlukan:
Dua koma di awal berarti "lewati index 0 dan 1." Agak padat dilihat, tetapi praktis saat kamu hanya butuh satu nilai dari tengah.
Destructuring array sangat berguna untuk fungsi yang mengembalikan tuple:
Pola yang sama muncul di mana-mana di React hooks: const [count, setCount] = useState(0).
Pola Rest: Mengumpulkan Sisanya
Di dalam pola destructuring, ...name mengumpulkan semua yang tidak dicocokkan berdasarkan nama atau posisi ke dalam variabel baru.
Untuk array, rest mengambil bagian ekornya:
Untuk objek, rest mengambil setiap property yang tidak disebutkan secara eksplisit:
Inilah cara yang lazim untuk membuang satu field dari objek tanpa mengubah objek aslinya: rest adalah objek baru yang berisi semuanya kecuali id.
Rest harus menjadi elemen terakhir dalam pola. const [...init, last] adalah syntax error.
Destructuring Bersarang
Pola bisa bersarang. Kalau sebuah property juga berupa objek atau array, kamu bisa melakukan destructuring ke dalamnya dalam ekspresi yang sama:
Sangat kuat, tetapi pakailah dengan hati-hati. Tiga tingkat kurung kurawal bersarang mulai terasa seperti teka-teki. Kalau sudah begitu, pindahkan nilai perantara ke variabelnya sendiri: kode yang mudah dibaca lebih baik daripada kode yang cerdik.
Satu jebakan: data: { user } di dalam pola tidak membuat variabel bernama data. Itu hanya perintah untuk "masuk ke data dan lanjutkan destructuring." Kalau kamu butuh data itu sendiri, tambahkan secara terpisah:
Destructuring Parameter Fungsi
Tempat yang paling sering kamu pakai untuk destructuring adalah daftar parameter fungsi. Teknik ini mengubah "berikan sebuah objek options" menjadi signature yang menjelaskan dirinya sendiri:
Di tempat pemanggilan, bentuknya sama seperti pemanggilan dengan objek options biasa. Di dalam fungsi, kamu mendapat variabel bernama dengan nilai default, tanpa lagi boilerplate options.name || "default".
Satu jebakan tajam: memanggil fungsi ini tanpa argumen akan crash, karena kamu tidak bisa melakukan destructuring pada undefined. Beri nilai default untuk seluruh parameternya:
= {} setelah pola berarti "kalau tidak ada argumen yang masuk, anggap saja itu objek kosong." Lalu default di dalamnya yang mengambil alih.
Menukar dan Mengisi Ulang Nilai
Destructuring juga bekerja dengan variabel yang sudah dideklarasikan, tetapi kamu butuh kurung biasa di sekitar pola objek (kalau tidak, JavaScript membaca { sebagai awal sebuah blok):
Penukaran nilai dengan array terlihat rapi. Pengisian ulang dengan objek lebih jarang, tetapi trik kurung ini layak diingat untuk saat kamu membutuhkannya.
Contoh Realistis
Menggabungkan sebagian besar materi di atas: sebuah fungsi yang memproses response API:
Setiap lapisan destructuring punya nilai default, jadi fungsinya tetap bertahan saat datanya tidak lengkap, tanpa tumpukan pengaman if. Itulah keuntungan sebenarnya: signature yang presisi sekaligus pemaaf.
Berikutnya: Object Spread
Destructuring mengambil nilai keluar dari objek. Spread memasukkannya: menyalin, menggabungkan, dan menimpa. Keduanya selalu berjalan beriringan di JavaScript modern, dan spread adalah topik berikutnya.
Pertanyaan yang sering diajukan
Apa itu destructuring di JavaScript?
Destructuring adalah sintaks untuk mengambil nilai dari objek atau array dan mengikatnya ke variabel dalam satu langkah. const { name } = user; mengambil property name dari user. const [first, second] = list; mengambil dua elemen pertama dari list. Ini adalah pola di sisi kiri = yang mencerminkan bentuk nilai di sisi kanan.
Bagaimana cara mengganti nama variabel saat destructuring?
Pakai sintaks { original: newName }. const { name: username } = user; mengambil property name dari user dan mengikatnya ke variabel lokal bernama username. Sintaks ini mudah disangka anotasi tipe. Ingat: nama property ditulis lebih dulu, lalu nama variabel baru setelah titik dua.
Bisakah memberi nilai default saat destructuring?
Bisa. const { timeout = 5000 } = options; memakai 5000 kalau options.timeout bernilai undefined. Default hanya berlaku untuk undefined: null, 0, dan '' diteruskan apa adanya. Kamu bisa menggabungkan default dengan penggantian nama: const { t: timeout = 5000 } = options;.
Apa bedanya destructuring dan spread?
Keduanya terlihat mirip tetapi melakukan hal yang berlawanan. Destructuring (const { a, b } = obj) mengambil nilai keluar dari sebuah struktur. Spread (const copy = { ...obj }) memasukkan nilai ke dalam struktur baru. ... di dalam pola destructuring adalah pola rest: ia mengumpulkan sisanya ke variabel baru.