Function sapa yang memanggil dengan sapa("Budi") dan sapa("Siti") jauh lebih berguna daripada dua function terpisah yang masing-masing hanya bisa menyapa satu nama. Jalur masuk data itu disediakan oleh parameter: daftar nama di dalam tanda kurung definisi function yang berperan sebagai wadah sementara. Sebelum ECMAScript 2015, programmer mengatasinya dengan menulis pemeriksaan manual di awal badan function: jika parameter kosong, isi dengan nilai tertentu. Pola itu bekerja, tetapi tiap function membawa beberapa baris rutinitas yang sama. Default parameters memindahkan nilai cadangan itu ke tempat yang paling mudah dibaca: langsung di daftar parameter.
Chapter ini menguji empat cara mengirim argument terhadap satu parameter ber-default, membahas urutan parameter yang tepat, lalu menunjukkan bahwa nilai default boleh berupa ekspresi lengkap — bukan hanya angka atau string tetap.
Empat Cara Mengirim, Dua yang Memakai Default #
Aturan dasarnya sederhana: parameter yang ditulis nama = nilai memakai nilai bila argument-nya tidak dikirim. Yang perlu dibuktikan adalah batas tepatnya — kapan default terpakai dan kapan tidak. Berkas contoh menguji empat kemungkinan sekaligus. Hasilnya bisa dirangkum dalam satu tabel kecil untuk parameter sapaan:
| Argument kedua yang dikirim | Nilai yang diterima sapaan |
|---|---|
| tidak dikirim | "Halo" — default terpakai |
undefined (eksplisit) | "Halo" — default tetap terpakai |
null | null — default tidak terpakai |
teks apa pun, mis. "Hai" | teks itu — default diabaikan |
Empat baris tabel itu adalah seluruh aturan mainnya: default menyambut ketiadaan (undefined), tetapi tetap menghormati nilai yang dikirim — sekecil apa pun nilainya, termasuk null. Berikut bukti lengkapnya:
// parameter-bawaan.js
// Default parameters: nilai cadangan untuk parameter yang tidak dikirim.
// --- 1. nilai bawaan dasar dan empat cara mengirim argument ---
function sapa(nama, sapaan = "Halo") {
console.log(sapaan + ", " + nama + "!");
}
sapa("Budi"); // sapaan tidak dikirim -> default terpakai
sapa("Siti", "Selamat pagi"); // sapaan dikirim -> default diabaikan
sapa("Budi", undefined); // undefined eksplisit -> default tetap terpakai
sapa("Budi", null); // null BUKAN undefined -> default tidak terpakai
// --- 2. urutan parameter: yang ber-default diletakkan di belakang ---
function buatLabel(nama, kota, tanda = "*") {
return tanda + " " + nama + " - " + kota;
}
console.log(buatLabel("Budi", "Bandung"));
console.log(buatLabel("Siti", "Bogor", "#"));
// --- 3. memaksa parameter tengah memakai default dengan undefined ---
console.log(buatLabel("Rina", undefined, "#"));
// --- 4. ekspresi sebagai default, dievaluasi setiap kali dipanggil ---
function ongkir(beratKg, tarifPerKg = beratKg > 5 ? 4000 : 5000) {
return "Ongkir Rp" + beratKg * tarifPerKg;
}
console.log(ongkir(2));
console.log(ongkir(8));
console.log(ongkir(8, 3000));
// --- 5. default berupa hasil perbandingan parameter sebelumnya ---
function rincian(nama, jumlah, ringkas = jumlah <= 1) {
console.log(nama + " x" + jumlah + " (ringkas: " + ringkas + ")");
}
rincian("Pulpen", 1);
rincian("Buku", 4);Output yang Dihasilkan:
Halo, Budi!
Selamat pagi, Siti!
Halo, Budi!
null, Budi!
* Budi - Bandung
# Siti - Bogor
# Rina - undefined
Ongkir Rp10000
Ongkir Rp32000
Ongkir Rp24000
Pulpen x1 (ringkas: true)
Buku x4 (ringkas: false)Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 9 (
sapa("Budi");): argument kedua tidak dikirim, sehinggasapaanmemakai default"Halo". Inilah kasus yang dirancang untuk difasilitasi default parameters. - Baris 10 (
sapa("Siti", "Selamat pagi");): argument dikirim, default dibiarkan. Nilai bawaan hanya cadangan — tidak pernah menimpa data nyata. - Baris 11 (
sapa("Budi", undefined);): pemanggil menulisundefinedsecara eksplisit, dan hasilnya sama dengan tidak mengirim sama sekali: default tetap terpakai. Inilah kunci untuk “melewati” parameter tengah tanpa mengubah posisi argument lain (dibuktikan lagi di baris 23). - Baris 12 (
sapa("Budi", null);): jebakan terpenting bab ini. Default hanya terpakai untukundefined— bukannull. Karena argumentnyanull, hasilnya benar-benarnull, Budi!. Nilai yang terlihat hampir sama di layar ternyata diperlakukan berbeda. - Baris 15–23 (
buatLabeldan tiga pemanggilannya): parametertandaber-default diletakkan paling akhir. Pemanggilan ketiga mengirimundefineddi posisikotauntuk melompatinya — defaulttandatetap digantikan oleh"#", sedangkankotajujur tampil sebagaiundefinedkarena memang tidak punya default. - Baris 26–32 (
ongkir): default berupa ekspresi ternary yang membacaberatKg— parameter di depannya. Ekspresi ini dievaluasi ulang setiap kali function dipanggil, bukan sekali saat berkas dimuat:ongkir(2)memakai tarif 5000,ongkir(8)memakai 4000, danongkir(8, 3000)tidak menyentuh default karena tarif dikirim langsung. - Baris 35–40 (
rincian): default pun boleh berupa hasil perbandingan boolean.ringkas = jumlah <= 1menghasilkantrueuntuk satu item danfalseuntuk lebih.
Satu catatan kecil tentang properti length yang kita kenal di chapter Parameters dan Arguments: parameter ber-default tidak dihitung. sapa di berkas ini melaporkan sapa.length bernilai 1, bukan 2, karena sapaan ber-default. Angka itu menghitung parameter “wajib” yang harus dikirim pemanggil. Dari sisi pembaca kode, kegunaan default lain juga terasa: signature function sapa(nama, sapaan = "Halo") sekaligus mendokumentasikan dirinya — pemanggil langsung tahu parameter mana yang wajib dan apa nilai bawaan parameter opsional, tanpa membuka badan function.
Default Bisa Berupa Pemanggilan Function #
Nilai bawaan tidak harus angka atau teks tetap — ia boleh berupa ekspresi apa pun, termasuk pemanggilan function lain. Cara ini berguna bila nilai cadangan perlu dihitung atau diambil dari sumber tertentu. Berikut versi ongkir dengan tarif dari sebuah function:
function tarifStandar() {
console.log("Menghitung tarif standar...");
return 5000;
}
function ongkir(beratKg, tarifPerKg = tarifStandar()) {
return beratKg * tarifPerKg;
}
console.log(ongkir(2));
console.log(ongkir(2, 3000));Output yang Dihasilkan:
Menghitung tarif standar...
10000
6000Perhatikan urutannya: pesan Menghitung tarif standar... hanya muncul satu kali, tepat sebelum keluaran 10000. Ekspresi default dievaluasi malas — hanya saat dibutuhkan. Pemanggilan ongkir(2) membutuhkan default, sehingga tarifStandar() berjalan. Pemanggilan ongkir(2, 3000) menyediakan tarif sendiri, sehingga function tersebut tidak dipanggil sama sekali. Perilaku malas ini penting bila penghitungan default mahal — membaca data besar atau meminta nilai dari sumber luar — karena pemanggilan yang tidak membutuhkannya tidak pernah membayar harganya.
Urutan yang Sehat: Wajib di Depan, Opsional di Belakang #
Aturan penataan yang lazim: parameter yang hampir selalu dikirim diletakkan di depan; parameter yang sering kosong — beserta default-nya — diletakkan di belakang. Susunan ini membuat pemanggilan paling umum tetap singkat (ongkir(2)), sementara pemanggilan khusus tetap mungkin (ongkir(8, 3000)). Susunan terbalik memaksa pemanggil menulis undefined berulang kali hanya untuk menjangkau parameter terakhir.
Batas sebaliknya juga perlu dipegang: tidak semua parameter layak diberi default. Data yang tanpanya function tidak bermakna — misalnya nama pengguna pada function pendaftaran — lebih jujur dibiarkan tanpa nilai bawaan, sehingga kelalaian pemanggil terlihat sebagai undefined yang bisa dilacak, bukan tersamar di balik nilai yang terlihat normal.
Parameter yang sering kosong kini punya jawaban. Pertanyaan berikutnya berbeda sifatnya: bagaimana menulis function yang jumlah argument-nya memang tak terbatas — misalnya menjumlahkan dua angka, lima angka, atau dua puluh? Default tidak menolong di sini, karena jumlah parameter tetap harus ditulis satu per satu di signature. Chapter berikutnya menjawabnya dengan rest parameters, yang mengumpulkan sisa argument menjadi satu array sungguhan.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
parameter-bawaan.js
Unduh berkas// parameter-bawaan.js
// Default parameters: nilai cadangan untuk parameter yang tidak dikirim.
// --- 1. nilai bawaan dasar dan empat cara mengirim argument ---
function sapa(nama, sapaan = "Halo") {
console.log(sapaan + ", " + nama + "!");
}
sapa("Budi"); // sapaan tidak dikirim -> default terpakai
sapa("Siti", "Selamat pagi"); // sapaan dikirim -> default diabaikan
sapa("Budi", undefined); // undefined eksplisit -> default tetap terpakai
sapa("Budi", null); // null BUKAN undefined -> default tidak terpakai
// --- 2. urutan parameter: yang ber-default diletakkan di belakang ---
function buatLabel(nama, kota, tanda = "*") {
return tanda + " " + nama + " - " + kota;
}
console.log(buatLabel("Budi", "Bandung"));
console.log(buatLabel("Siti", "Bogor", "#"));
// --- 3. memaksa parameter tengah memakai default dengan undefined ---
console.log(buatLabel("Rina", undefined, "#"));
// --- 4. ekspresi sebagai default, dievaluasi setiap kali dipanggil ---
function ongkir(beratKg, tarifPerKg = beratKg > 5 ? 4000 : 5000) {
return "Ongkir Rp" + beratKg * tarifPerKg;
}
console.log(ongkir(2));
console.log(ongkir(8));
console.log(ongkir(8, 3000));
// --- 5. default berupa hasil perbandingan parameter sebelumnya ---
function rincian(nama, jumlah, ringkas = jumlah <= 1) {
console.log(nama + " x" + jumlah + " (ringkas: " + ringkas + ")");
}
rincian("Pulpen", 1);
rincian("Buku", 4);