Function hitungTotal pada chapter Parameters dan Arguments berhasil menjumlahkan sejumlah angka bebas, tetapi caranya menumpang pada arguments object — wadah berusia yang bukan array sungguhan dan tidak tersedia di function arrow. JavaScript modern menyediakan jalur resminya: rest parameter. Tanda tiga titik (...) di depan satu nama parameter menyatakan “kumpulkan seluruh argument yang tersisa menjadi satu array”.
Chapter ini membuktikan perilaku rest parameter dari tiga sisi — sebagai array sungguhan, sebagai parameter terakhir yang digabung dengan parameter biasa, dan sebagai array kosong saat tidak ada argument. Kita menutup dengan perbandingan langsung terhadap arguments agar perbedaannya tidak sekadar teori.
Rest Mengumpulkan Sisa Argument #
Cara membaca function jumlahkan(...angka) adalah: apapun yang dikirim pemanggil, seluruhnya masuk ke satu array bernama angka. Karena angka benar-benar array, length, akses indeks, dan pemeriksaan Array.isArray bekerja seperti pada array biasa:
// parameter-rest.js
// Rest parameter: mengumpulkan sisa argument menjadi satu array.
// --- 1. rest menampung semua argument sebagai array sungguhan ---
function jumlahkan(...angka) {
console.log("Isi rest:", angka, "- jenis:", Array.isArray(angka));
let total = 0;
for (let i = 0; i < angka.length; i++) {
total = total + angka[i];
}
return total;
}
console.log("Total A:", jumlahkan(1, 2, 3));
console.log("Total B:", jumlahkan(10, 20, 30, 40));
// --- 2. rest boleh digabung parameter biasa, tetapi harus paling akhir ---
function buatTim(ketua, ...anggota) {
console.log("Ketua:", ketua, "- jumlah anggota:", anggota.length);
}
buatTim("Budi", "Siti", "Rina", "Tono");
// --- 3. dipanggil tanpa argument pun rest tetap berupa array kosong ---
function catat(...pesan) {
console.log("Tercatat", pesan.length, "pesan");
}
catat();
catat("mulai", "selesai");
// --- 4. rest vs arguments object ---
function bandingkan() {
console.log("Array.isArray(arguments):", Array.isArray(arguments));
console.log("arguments[0]:", arguments[0]);
}
bandingkan("apel", "mangga");Output yang Dihasilkan:
Isi rest: [ 1, 2, 3 ] - jenis: true
Total A: 6
Isi rest: [ 10, 20, 30, 40 ] - jenis: true
Total B: 100
Ketua: Budi - jumlah anggota: 3
Tercatat 0 pesan
Tercatat 2 pesan
Array.isArray(arguments): false
arguments[0]: apelMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 5–11 (
function jumlahkan(...angka) { ... }): tiga argument pemanggil dikumpulkan menjadi array[ 1, 2, 3 ]. PemeriksaanArray.isArray(angka)melaporkantrue— inilah pembeda utamanya dariarguments. - Baris 8–10 (loop
fordanreturn): karenaangkaarray sungguhan, perhitungan memakailengthdan indeks seperti biasa. Loop yang sama berlaku untuk pemanggilan berikutnya dengan empat argument tanpa perubahan apa pun pada definisi function. - Baris 18–22 (
function buatTim(ketua, ...anggota)): rest boleh disandingkan parameter biasa. Argument pertama ("Budi") mengisiketua, dan sisanya — bukan semuanya — masukanggota. Inilah makna kata “rest”: sisa. - Baris 25–30 (
catatdan dua pemanggilannya): pemanggilan tanpa argument tidak membuatpesanbernilaiundefined. Rest selalu berupa array; tanpa argument isinya array kosong, sehinggapesan.lengthtetap aman dibaca — hasilnya0. - Baris 33–38 (
bandingkan): pembanding langsung. Function tanpa rest memakaiargumentssecara diam-diam, danArray.isArray(arguments)melaporkanfalse. Keduanya menerima argument yang sama, tetapi jenis wadahnya berbeda.
Posisi Rest Harus Paling Akhir #
Hanya satu rest parameter yang boleh ada, dan posisinya wajib terakhir. Bayangkan jika tidak: argument keberapa yang menjadi ketua, keberapa yang masuk anggota, dan keberapa yang menjadi parameter sesudahnya? Aturan ini ditegaskan engine saat berkas dimuat. Jika berkas berikut dijalankan:
function salah(a, ...b, c) {} // rest di tengah, parameter sesudahnya
Node menolaknya sebelum satu baris pun dieksekusi:
SyntaxError: Rest parameter must be last formal parameterKarena tidak ada parameter setelah rest, properti length function ber-rest hanya menghitung parameter di depannya: buatTim melaporkan length bernilai 1 — parameter yang “wajib” dikirim hanyalah ketua.
Rest di Praktik: Daftar Bernomor #
Kombinasi “satu parameter bermakna + rest” sangat sering muncul di kode nyata. Helper berikut mencetak judul lalu seluruh item dalam bentuk daftar bernomor — jumlah itemnya bebas, tanpa perlu mengubah definisi function:
function buatDaftar(judul, ...item) {
console.log("== " + judul + " ==");
for (let i = 0; i < item.length; i++) {
console.log((i + 1) + ". " + item[i]);
}
}
buatDaftar("Belanja Siti", "Beras", "Minyak", "Tahu");Output yang Dihasilkan:
== Belanja Siti ==
1. Beras
2. Minyak
3. TahuPola ini mempertahankan dua keuntungan sekaligus: judul punya nama yang jelas sehingga pemanggil tahu argument pertama itu apa, dan sisanya mengalir ke item tanpa perhitungan indeks yang rumit di badan function. Bila helper dipanggil dengan tujuh item, tidak ada satu baris pun yang berubah — persis fleksibilitas yang tidak dimiliki daftar parameter tetap.
Cara membaca definisinya juga layak dibiasakan: function buatDaftar(judul, ...item) dibaca “buat daftar dengan judul, lalu berapa pun item-nya”. Rest parameter membuat signature function sekaligus mendokumentasikan maksudnya — parameter yang berulang dan tak terbatas tidak lagi disembunyikan di dalam badan, melainkan tertulis di daftar parameter.
Mengapa rest tanpa argument tetap berupa array kosong, bukan undefined? Karena pilihannya membuat perilaku seragam: badan function tidak perlu bercabang menangani dua bentuk data. Loop for di atas berjalan nol putaran untuk array kosong — tidak ada if tambahan, tidak ada pengecekan yang terlewat. Desain kecil semacam ini mengurangi satu sumber bug klasik saat menerima data yang jumlahnya tidak pasti.
Dua catatan penutup tentang tanda ... yang sama. Pertama, rest selalu mengisi parameter; peran lain dari tanda tiga titik — memecah array menjadi argument saat memanggil (spread) — dibahas di section Arrays, dan membedakan keduanya penting agar tidak tertukar. Kedua, karena rest menghasilkan array sungguhan, method array seperti pencarian dan penyaringan bisa dipakai langsung atas nilainya begitu section Arrays dibuka.
Rest vs arguments Object #
Hasil eksperimen berkas contoh kini bisa dirangkum:
| Aspek | Rest parameter (...angka) | arguments object |
|---|---|---|
| Jenis wadah | array sungguhan (Array.isArray → true) | object menyerupai array (false) |
| Bentuk penulisan | eksplisit di daftar parameter, bernama | tersedia diam-diam di badan function |
| Tersedia di function arrow | ya | tidak sama sekali |
| Nilai saat tanpa argument | array kosong | object kosong |
Dua baris pertama tabel adalah bukti langsung dari berkas contoh. Dua baris berikutnya menjelaskan mengapa kode modern memilih rest: satu penulisan yang bisa dibaca, dan kompatibel dengan function arrow yang akan kita bahas di chapter berikutnya. Perhatikan pula bahwa tabel tidak menyatakan arguments “rusak” — untuk function biasa, wadah lama itu tetap berfungsi. Pilihan modern lebih soal kejelasan dan jangkauan: rest tertulis di signature sehingga terbaca tanpa membuka badan function, dan satu pola itu tetap bekerja saat function diubah menjadi arrow.
Function dengan sintaks function kini sudah kita kuasai dari semua sisi. Chapter berikutnya memperkenalkan bentuk penulisan yang lebih ringkas dari ES2015 — arrow function — beserta satu perbedaan perilaku yang bukan sekadar gaya: urusan this.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
parameter-rest.js
Unduh berkas// parameter-rest.js
// Rest parameter: mengumpulkan sisa argument menjadi satu array.
// --- 1. rest menampung semua argument sebagai array sungguhan ---
function jumlahkan(...angka) {
console.log("Isi rest:", angka, "- jenis:", Array.isArray(angka));
let total = 0;
for (let i = 0; i < angka.length; i++) {
total = total + angka[i];
}
return total;
}
console.log("Total A:", jumlahkan(1, 2, 3));
console.log("Total B:", jumlahkan(10, 20, 30, 40));
// --- 2. rest boleh digabung parameter biasa, tetapi harus paling akhir ---
function buatTim(ketua, ...anggota) {
console.log("Ketua:", ketua, "- jumlah anggota:", anggota.length);
}
buatTim("Budi", "Siti", "Rina", "Tono");
// --- 3. dipanggil tanpa argument pun rest tetap berupa array kosong ---
function catat(...pesan) {
console.log("Tercatat", pesan.length, "pesan");
}
catat();
catat("mulai", "selesai");
// --- 4. rest vs arguments object ---
function bandingkan() {
console.log("Array.isArray(arguments):", Array.isArray(arguments));
console.log("arguments[0]:", arguments[0]);
}
bandingkan("apel", "mangga");