Dari ES6 / ES2015 , parameter default ada dalam spesifikasi bahasa.
function read_file(file, delete_after = false) {
// Code
}
hanya bekerja.
Referensi: Parameter Default - MDN
Parameter fungsi default memungkinkan parameter formal diinisialisasi dengan nilai default jika tidak ada nilai atau tidak terdefinisi .
Anda juga dapat mensimulasikan parameter bernama default melalui penghancuran :
// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
// Use the variables `start`, `end` and `step` here
···
}
Sebelum ES2015 ,
Ada banyak cara, tetapi ini adalah metode yang saya sukai - ini memungkinkan Anda memasukkan apa pun yang Anda inginkan, termasuk false atau null. ( typeof null == "object"
)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }
dan kemudian Anda dapat menyebutnya sebagaia = defaultFor(a, 42);
undefined
objek: p Bahkan ketika itu dapat bekerja dengan beberapa browser dan mungkin lebih cepat,null
masih merupakan objek danundefined
referensi ke tipe primitif yang mencoba untuk mengatakan bahwa ada tidak ada apa-apa di sini, bahkan tidaknull
. Lihat di sini, kedua kasus singkatnya: JavaScript / Referensi / Global_Objects / tidak terdefinisi .typeof
itu mubazir.function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
Ini tidak akan membuang kesalahan referensi dan singkat.a = a
danb = b
ketika parameter tersebut tidak ditentukan. Juga, operator ternary dengan kondisi yang agak rumit mungkin sulit dibaca untuk pengelola masa depan. Saya lebih suka sintaks berikut:if (typeof a == 'undefined') a = 42
- tidak ada tugas yang tidak perlu ditambah sedikit lebih mudah dibaca.typeof
? Tampaknya lebih sederhana untuk dilakukana === undefined
. Selain itu, Anda akan mendapatkan kesalahan referensi jika Anda salah mengejaundefined
dan memasukkannya ke dalam string.Ini memberikan
delete_after
nilaidelete_after
jika bukan nilai falsey jika tidak maka akan memberikan string"my default here"
. Untuk lebih detail, lihat survei bahasa Doug Crockford dan periksa bagian tentang Operator .Pendekatan ini tidak bekerja jika Anda ingin lulus dalam falsey nilai yaitu
false
,null
,undefined
,0
atau""
. Jika Anda memerlukan nilai falsey untuk diteruskan, Anda harus menggunakan metode dalam jawaban Tom Ritter .Ketika berhadapan dengan sejumlah parameter ke suatu fungsi, sering kali berguna untuk memungkinkan konsumen untuk melewatkan argumen parameter dalam suatu objek dan kemudian menggabungkan nilai-nilai ini dengan objek yang berisi nilai default untuk fungsi tersebut.
menggunakan
sumber
delete_after
tidak mendapatkan hasil boolean dari ekspresidelete_after || "my default value"
?Saya menemukan sesuatu yang sederhana seperti ini menjadi jauh lebih ringkas dan dapat dibaca secara pribadi.
sumber
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. Menggunakan namespace global seperti yang ditunjukkan dalam jawaban ini oleh banyak orang dianggap praktik buruk. Anda juga dapat mempertimbangkan untuk menggulir utilitas Anda sendiri untuk tugas umum ini (mis.util.default(arg, "defaul value")
) Jika tidak ingin menggunakan garis bawah, tapi saya akhirnya menggunakan garis bawah cepat atau lambat bagaimanapun juga tidak ada gunanya menciptakan kembali roda.undefined
dengan beberapa nilai lain, menyebabkan tes gagal.undefined
. Jadi, ini masih ide yang bagus untuk digunakantypeof
dan'undefined'
.Dalam ECMAScript 6 Anda benar-benar dapat menulis apa yang Anda miliki:
Ini akan diatur
delete_after
kefalse
jika tidak ada atauundefined
. Anda dapat menggunakan fitur ES6 seperti ini hari ini dengan transpiler seperti Babel .Lihat artikel MDN untuk informasi lebih lanjut .
sumber
Nilai Parameter Default
Dengan ES6, Anda dapat melakukan salah satu idiom paling umum dalam
JavaScript
kaitannya dengan pengaturan nilai default untuk parameter fungsi. Cara kami melakukan ini selama bertahun-tahun akan terlihat cukup akrab:Pola ini paling banyak digunakan, tetapi berbahaya ketika kita memberikan nilai seperti
Mengapa? Karena
0 is falsy
, dan sebagainyax || 11 results in 11
, bukan yang secara langsung disahkan dalam 0. Untuk memperbaiki gotcha ini, beberapa orang malah akan menulis cek dengan lebih jelas seperti ini:kita sekarang dapat memeriksa sintaks yang bagus dan membantu
ES6
untuk merampingkan penetapan nilai default ke argumen yang hilang:x = 11
dalam deklarasi fungsi lebih sepertix !== undefined ? x : 11
daripada idiom yang jauh lebih umumx || 11
Ekspresi Nilai Default
Function
nilai default bisa lebih dari sekadar nilai sederhana seperti 31; mereka dapat berupa ekspresi yang valid, bahkan afunction call
:Seperti yang Anda lihat, ekspresi nilai default dievaluasi dengan malas, artinya hanya berjalan jika dan ketika dibutuhkan - yaitu, ketika argumen parameter dihilangkan atau tidak ditentukan.
Ekspresi nilai default bahkan bisa menjadi panggilan ekspresi fungsi sebaris - umumnya disebut sebagai Ekspresi Fungsi yang Segera Diminta
(IIFE)
:sumber
solusi itu bekerja untuk saya di js:
sumber
delete_after
yang0
ataunull
? Ini tidak akan berfungsi dengan benar untuk kasus ini.delete_after = delete_after === undefined ? false : delete_after
?Cukup gunakan perbandingan eksplisit dengan undefined.
sumber
Saya akan sangat menyarankan hati-hati ketika menggunakan nilai parameter default di javascript. Ini sering menimbulkan bug ketika digunakan bersama dengan fungsi yang lebih tinggi seperti
forEach
,map
, danreduce
. Sebagai contoh, pertimbangkan baris kode ini:parseInt memiliki parameter kedua
function parseInt(s, [
radix opsional=10])
tetapi memetakan panggilanparseInt
dengan tiga argumen: ( elemen , indeks , dan array ).Saya sarankan Anda memisahkan parameter yang diperlukan dari argumen opsional / standar Anda. Jika fungsi Anda mengambil 1,2, atau 3 parameter yang diperlukan yang tidak ada nilai default yang masuk akal, menjadikannya parameter posisional untuk fungsi tersebut, setiap parameter opsional harus mengikuti atribut yang dinamai objek tunggal. Jika fungsi Anda membutuhkan 4 atau lebih, mungkin lebih masuk akal untuk memasok semua argumen melalui atribut parameter objek tunggal.
Dalam kasus Anda, saya akan menyarankan Anda menulis fungsi DeleteFile seperti ini: ( diedit per
instead
's komentar ) ...Menjalankan cuplikan di atas menggambarkan bahaya yang bersembunyi di balik nilai argumen default untuk parameter yang tidak digunakan.
sumber
typeof deleteAfter === 'bool'
dan throw Exception sebaliknya. Plus jika menggunakan metode seperti map / foreach dll. Gunakan saja dengan hati-hati dan bungkus fungsi yang disebut dengan fungsi anonim.['1', '2', '3'].map((value) => {read_file(value);})
get
metode lodash untuk mengambil deleteAfter. Melempar pengecualian jikatypeof 'deleteAfter' !== 'bool'
juga bisa menjadi langkah bijaksana yang baik. Saya tidak suka merancang metode yang mengharuskan penelepon untuk "menggunakan hati-hati". Perhatian adalah tanggung jawab fungsi, bukan penelepon. Perilaku akhir harus mengikuti prinsip paling tidak mengejutkan.Sebagai pembaruan ... dengan ECMAScript 6 Anda AKHIRNYA dapat menetapkan nilai default dalam deklarasi parameter fungsi seperti:
Seperti yang dirujuk oleh - http://es6-features.org/#DefaultParameterValues
sumber
menjadi pengembang C ++ yang lama (Rookie to web development :)), ketika saya pertama kali menemukan situasi ini, saya melakukan penugasan parameter dalam definisi fungsi, seperti yang disebutkan dalam pertanyaan, sebagai berikut.
Tetapi berhati-hatilah karena itu tidak bekerja secara konsisten di seluruh browser. Bagi saya itu berfungsi di chrome di desktop saya, tetapi tidak bekerja di chrome di android. Opsi yang lebih aman, karena banyak yang telah disebutkan di atas adalah -
Niat untuk jawaban ini bukan untuk mengulangi solusi yang sama, apa yang telah disebutkan orang lain, tetapi untuk menginformasikan bahwa penetapan parameter dalam definisi fungsi dapat berfungsi pada beberapa browser, tetapi jangan bergantung padanya.
sumber
function myfunc(a,b=10)
adalah sintaks ES6, ada tautan ke tabel kompatibilitas di jawaban lain.Bagi siapa pun yang tertarik memiliki kode yang berfungsi di Microsoft Edge, jangan gunakan standar dalam parameter fungsi.
Dalam contoh itu, Edge akan menampilkan kesalahan "Mengharapkan ')'"
Untuk menyiasati penggunaan ini
Sampai 08 Agustus 2016 ini masih menjadi masalah
sumber
Sesuai sintaks
Anda dapat menentukan nilai default dari parameter formal. dan juga memeriksa nilai yang tidak ditentukan dengan menggunakan fungsi typeof .
sumber
sumber
Gunakan ini jika Anda ingin menggunakan
ECMA6
sintaks terbaru :Ini disebut
default function parameters
. Ini memungkinkan parameter formal diinisialisasi dengan nilai default jika tidak ada nilai atau tidak terdefinisi. CATATAN : Ini tidak akan berfungsi dengan Internet Explorer atau browser yang lebih lama.Untuk kompatibilitas maksimum yang mungkin, gunakan ini:
Kedua fungsi memiliki perilaku yang sama persis karena masing-masing contoh ini bergantung pada fakta bahwa variabel parameter akan menjadi
undefined
jika tidak ada nilai parameter yang dilewati ketika memanggil fungsi itu.sumber
ES6: Seperti yang sudah disebutkan di sebagian besar jawaban, di ES6, Anda cukup menginisialisasi parameter bersama dengan nilai.
ES5: Sebagian besar jawaban yang diberikan tidak cukup baik bagi saya karena ada beberapa kesempatan di mana saya mungkin harus memberikan nilai falsey seperti
0
,null
danundefined
ke suatu fungsi. Untuk menentukan apakah suatu parameter tidak terdefinisi karena itulah nilai yang saya berikan alih-alih tidak terdefinisi karena tidak didefinisikan sama sekali, saya melakukan ini:sumber
Here foo () adalah fungsi yang memiliki parameter bernama argValue. Jika kita tidak melewatkan apa pun dalam pemanggilan fungsi di sini, maka fungsi throwIfNoValue () akan dipanggil dan hasil yang dikembalikan akan ditugaskan ke argumen hanya ArgValue. Ini adalah bagaimana panggilan fungsi dapat digunakan sebagai parameter default. Yang membuat kode lebih disederhanakan dan dibaca.
Contoh ini diambil dari sini
sumber
Jika Anda menggunakan,
ES6+
Anda dapat mengatur parameter default dengan cara berikut:Jika Anda membutuhkan
ES5
sintaks, Anda dapat melakukannya dengan cara berikut:Dalam sintaks di atas
OR
operator digunakan. TheOR
Operator selalu mengembalikan nilai pertama jika ini dapat dikonversi ketrue
jika tidak mengembalikan nilai righthandside. Ketika fungsi dipanggil tanpa argumen yang sesuai, variabel parameter (bar
dalam contoh kami) diaturundefined
oleh mesin JS.undefined
Kemudian dikonversi ke false dan dengan demikianOR
operator mengembalikan nilai 0.sumber
Ya, menggunakan parameter default didukung sepenuhnya di ES6 :
atau
tetapi sebelumnya di ES5 Anda dapat dengan mudah melakukan ini:
Yang berarti jika nilainya ada di sana, gunakan nilainya, jika tidak, gunakan nilai kedua setelah
||
operasi yang melakukan hal yang sama ...Catatan: juga ada perbedaan besar di antara mereka jika Anda memberikan nilai ke ES6 satu bahkan nilainya falsy, yang akan diganti dengan nilai baru, sesuatu seperti
null
atau""
... tetapi ES5 satu hanya akan diganti jika hanya nilai yang diteruskan benar, itu karena cara||
kerjanya ...sumber
Jika karena alasan tertentu Anda tidak di ES6 dan yang menggunakan
lodash
di sini adalah cara ringkas untuk default parameter fungsi melalui_.defaultTo
metode:Yang akan mengatur default jika nilai saat ini adalah NaN , null , atau tidak terdefinisi
sumber
Sounds of Future
Di masa depan, Anda akan dapat "menyebar" satu objek ke objek lain (saat ini pada 2019 TIDAK didukung oleh Edge !) - menunjukkan cara menggunakannya untuk opsi default yang bagus terlepas dari urutan:
Referensi MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
... sementara itu yang didukung Edge DOES adalah Object.assign () (IE tidak, tapi saya sangat berharap kita dapat meninggalkan IE di belakang :))
Demikian pula yang bisa Anda lakukan
EDIT: Karena komentar tentang
const
opsi - masalah dengan menggunakan opsi konstan di sisa fungsi sebenarnya bukan karena Anda tidak bisa melakukan itu, hanya saja Anda tidak dapat menggunakan variabel konstan dalam deklarasi sendiri - Anda akan memiliki untuk menyesuaikan penamaan input ke sesuatu sepertisumber
function(opt){ const opt = /*some merging*/; }
? Itu pasti tidak akan berhasil karena Anda akan menggunakanconst
variabel sebelum dideklarasikan - Anda harus menyesuaikan -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
Sekadar memamerkan keahlian saya juga (lol), fungsi di atas dapat ditulis bahkan tanpa menyebutkan argumen seperti di bawah:
ES5 dan di atasnya
ES6 ke atas
sumber
Kode berikut dapat berfungsi dalam situasi ini termasuk ECMAScript 6 (ES6) serta versi sebelumnya.
karena nilai default dalam bahasa berfungsi saat nilai parameter fungsi dilewati saat memanggil, dalam JavaScript fungsi tersebut ditetapkan untuk tidak terdefinisi . Pendekatan ini tidak terlihat menarik secara pemrograman tetapi memiliki kompatibilitas ke belakang .
sumber
Ya ini disebut sebagai parameter default
Parameter fungsi default memungkinkan parameter formal diinisialisasi dengan nilai default jika tidak ada nilai atau tidak terdefinisi.
Sintaksis:
Deskripsi:
Parameter fungsi default ke undefined Namun, dalam situasi mungkin berguna untuk menetapkan nilai default yang berbeda. Di sinilah parameter default dapat membantu.
Di masa lalu, strategi umum untuk menetapkan standar adalah dengan menguji nilai parameter di badan fungsi dan menetapkan nilai jika tidak ditentukan. Jika tidak ada nilai yang diberikan dalam panggilan, nilainya akan tidak ditentukan. Anda harus menetapkan pemeriksaan bersyarat untuk memastikan parameter tidak terdefinisi
Dengan parameter default di ES2015, pemeriksaan di badan fungsi tidak lagi diperlukan. Sekarang Anda cukup meletakkan nilai default di kepala fungsi.
Contoh perbedaan:
Contoh Sintaks yang berbeda:
Padding tidak terdefinisi vs nilai-nilai palsu lainnya:
Bahkan jika nilainya diatur secara eksplisit saat memanggil, nilai argumen num adalah yang default.
Dievaluasi pada waktu panggilan:
Argumen default dievaluasi pada waktu panggilan, jadi tidak seperti beberapa bahasa lain, objek baru dibuat setiap kali fungsi dipanggil.
Parameter default tersedia untuk parameter default nanti:
Params sudah ditemui tersedia untuk parameter default nanti
Fungsi yang didefinisikan di dalam tubuh fungsi:
Diperkenalkan di Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Fungsi yang dideklarasikan di badan fungsi tidak dapat dirujuk di dalam parameter default dan melempar ReferenceError (saat ini TypeError di SpiderMonkey, lihat bug 1022967). Parameter default selalu dijalankan terlebih dahulu, deklarasi fungsi di dalam tubuh fungsi mengevaluasi sesudahnya.
Parameter tanpa default setelah parameter default:
Sebelum Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), kode berikut menghasilkan SyntaxError. Ini telah diperbaiki di bug 777060 dan berfungsi seperti yang diharapkan di versi yang lebih baru. Parameter masih diatur kiri-ke-kanan, menimpa parameter default bahkan jika ada parameter selanjutnya tanpa default.
Parameter yang dirusak dengan penetapan nilai default:
Anda dapat menggunakan penetapan nilai default dengan notasi penetapan merusak
sumber
Hanya pendekatan yang berbeda untuk mengatur params default adalah dengan menggunakan objek peta argumen, bukan argumen secara langsung. Sebagai contoh,
Dengan cara ini, mudah untuk memperluas argumen dan tidak khawatir tentang panjang ketidakcocokan argumen.
sumber
Jawabannya iya. Bahkan, ada banyak bahasa yang mendukung parameter default. Python adalah salah satunya:
Meskipun ini adalah kode Python 3 karena tanda kurung, parameter default dalam fungsi juga berfungsi di JS.
Misalnya, dan dalam kasus Anda:
Tetapi terkadang Anda tidak benar-benar membutuhkan parameter default.
Anda bisa mendefinisikan variabel tepat setelah dimulainya fungsi, seperti ini:
Dalam kedua contoh saya, ini mengembalikan hal yang sama. Tetapi kadang-kadang mereka sebenarnya bisa bermanfaat, seperti dalam proyek yang sangat maju
Jadi, sebagai kesimpulan, nilai parameter default dapat digunakan di JS. Tapi itu hampir sama dengan mendefinisikan variabel tepat setelah dimulainya fungsi. Namun, terkadang mereka masih sangat bermanfaat. Seperti yang Anda perhatikan, nilai parameter default mengambil 1 baris kode lebih sedikit daripada cara standar yang mendefinisikan parameter tepat setelah dimulainya fungsi.
EDIT: Dan ini sangat penting! Ini tidak akanberfungsi di IE. Lihat dokumentasi . Jadi dengan IE Anda harus menggunakan metode "define variable at top of function". Parameter default tidak akan berfungsi di IE.
sumber
Ya, ini akan berfungsi dalam Javascript. Anda juga dapat melakukannya:
sumber