Apakah ada cara untuk mengizinkan vars "tidak terbatas" untuk suatu fungsi dalam JavaScript?
Contoh:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
Apakah ada cara untuk mengizinkan vars "tidak terbatas" untuk suatu fungsi dalam JavaScript?
Contoh:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
Jawaban:
Tentu, cukup gunakan
arguments
objeknya.sumber
arguments
adalah objek khusus "Array-like", yang berarti memiliki panjang, tetapi tidak ada fungsi array lainnya. Lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… untuk informasi lebih lanjut, dan jawaban ini: stackoverflow.com/a/13145228/1766230length
properti. Ini termasukarguments
objek. Mengetahui hal ini, dan bahwa metodeconcat
mengembalikan salinan dari 'array yang' itu disebut, kita dapat dengan mudah mengkonversiarguments
objek untuk array nyata seperti ini:var args = [].concat.call(arguments)
. Beberapa orang lebih suka menggunakanArray.prototype.concat.call
, tetapi saya suka[]
, mereka pendek dan manis![...arguments].join()
Di (sebagian besar) browser terbaru, Anda dapat menerima jumlah variabel argumen dengan sintaks ini:
Ini sebuah contoh kecil:
Dokumentasi dan lebih banyak contoh di sini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters
sumber
Pilihan lain adalah meneruskan argumen Anda dalam objek konteks.
dan gunakan seperti ini
Ini memiliki keuntungan bahwa Anda dapat menambahkan argumen bernama sebanyak yang Anda inginkan, dan fungsinya dapat menggunakannya (atau tidak) sesuai keinginan.
sumber
context
argumen dengan kode dan menyebarkannya sebelum digunakan.Saya setuju dengan jawaban Ken sebagai yang paling dinamis dan saya ingin melangkah lebih jauh. Jika fungsi yang Anda panggil beberapa kali dengan argumen yang berbeda - Saya menggunakan desain Ken tetapi kemudian menambahkan nilai default:
Dengan cara ini, jika Anda memiliki banyak parameter tetapi tidak perlu mengaturnya dengan setiap panggilan ke fungsi, Anda cukup menentukan non-default. Untuk metode perluasan, Anda dapat menggunakan metode perluasan jQuery (
$.extend()
), membuat sendiri atau menggunakan yang berikut:Ini akan menggabungkan objek konteks dengan default dan mengisi nilai yang tidak terdefinisi dalam objek Anda dengan default.
sumber
_.defaults()
Metode Underscore adalah alternatif yang sangat bagus untuk menggabungkan argumen yang ditentukan dan default.Ya persis seperti ini:
sumber
Lebih baik menggunakan sintaks parameter istirahat seperti yang ditunjukkan Ramast.
Saya hanya ingin menambahkan beberapa properti bagus dari ... argumen args
sumber
Seperti yang sudah disebutkan, Anda dapat menggunakan
arguments
objek untuk mengambil sejumlah variabel parameter fungsi.Jika Anda ingin memanggil fungsi lain dengan argumen yang sama, gunakan
apply
. Anda bahkan dapat menambah atau menghapus argumen dengan mengonversikannyaarguments
ke array. Misalnya, fungsi ini menyisipkan beberapa teks sebelum masuk ke konsol:sumber
Meskipun saya umumnya setuju bahwa pendekatan argumen yang disebutkan berguna dan fleksibel (kecuali jika Anda peduli tentang urutannya, dalam hal mana argumen paling mudah), saya memang khawatir tentang biaya pendekatan mbeasley (menggunakan default dan extends). Ini adalah jumlah biaya ekstrem yang harus diambil untuk menarik nilai default. Pertama, default didefinisikan di dalam fungsi, sehingga dihuni kembali pada setiap panggilan. Kedua, Anda dapat dengan mudah membaca nilai yang disebutkan dan mengatur default pada saat yang sama menggunakan ||. Tidak perlu lagi membuat dan menggabungkan objek baru untuk mendapatkan informasi ini.
Ini kira-kira jumlah kode yang sama (mungkin sedikit lebih), tetapi harus menjadi sebagian kecil dari biaya runtime.
sumber
(parameter1=context.parameter1)===undefined && (parameter1=defaultValue1)
atau untuk volume kode yang lebih sedikit, fungsi pembantu kecil seperti:function def(providedValue, default) {return providedValue !== undefined ? providedValue : defaultValue;} var parameter1 = def(context.parameter1, defaultValue1)
memberikan pola alternatif. Namun, maksud saya masih berdiri: membuat objek tambahan untuk setiap pemanggilan fungsi dan menjalankan loop mahal untuk menetapkan beberapa nilai default adalah jumlah overhead gila.Sementara @roufamatic memang menunjukkan penggunaan kata kunci argumen dan @Ken menunjukkan contoh objek yang bagus untuk digunakan, saya merasa tidak benar-benar membahas apa yang terjadi dalam hal ini dan dapat membingungkan pembaca di masa depan atau menanamkan praktik buruk karena tidak secara eksplisit menyatakan fungsi. / Metode dimaksudkan untuk mengambil jumlah variabel argumen / parameter.
Ketika pengembang lain melihat melalui kode Anda, sangat mudah untuk menganggap fungsi ini tidak mengambil parameter. Apalagi jika pengembang itu tidak mengetahui argumen kata kunci . Karena itu, ide yang baik untuk mengikuti pedoman gaya dan konsisten. Saya akan menggunakan Google untuk semua contoh.
Mari kita secara eksplisit menyatakan fungsi yang sama memiliki parameter variabel:
Parameter objek VS var_args
Mungkin ada saat-saat ketika suatu objek dibutuhkan karena merupakan satu-satunya metode praktik terbaik dari peta data. Array asosiatif disukai dan tidak dianjurkan.
SIDENOTE: Kata kunci argumen sebenarnya mengembalikan kembali suatu objek menggunakan angka sebagai kunci. Warisan prototypal juga merupakan objek keluarga. Lihat akhir jawaban untuk penggunaan array yang tepat di JS
Dalam hal ini kita dapat secara eksplisit menyatakan ini juga. Catatan: konvensi penamaan ini tidak disediakan oleh Google tetapi merupakan contoh deklarasi eksplisit dari jenis param. Ini penting jika Anda ingin membuat pola pengetikan yang lebih ketat dalam kode Anda.
Yang mana yang harus dipilih?
Ini tergantung pada kebutuhan fungsi dan program Anda. Jika misalnya Anda hanya ingin mengembalikan basis nilai pada proses berulang di semua argumen yang disahkan maka pasti tetap dengan kata kunci argumen . Jika Anda membutuhkan definisi untuk argumen dan pemetaan data Anda maka metode objek adalah cara yang harus dilakukan. Mari kita lihat dua contoh dan kemudian kita selesai!
Penggunaan argumen
Penggunaan objek
Mengakses array daripada objek ("... args" Parameter lainnya)
Seperti disebutkan di bagian atas jawaban, kata kunci argumen sebenarnya mengembalikan sebuah objek. Karena ini, metode apa pun yang ingin Anda gunakan untuk sebuah array harus dipanggil. Contoh dari ini:
Untuk menghindari hal ini, gunakan parameter lainnya:
sumber
Gunakan
arguments
objek ketika di dalam fungsi untuk memiliki akses ke semua argumen yang dilewatkan.sumber
Ketahuilah bahwa melewatkan Objek dengan properti yang dinamai Ken menyarankan menambah biaya pengalokasian dan melepaskan objek sementara untuk setiap panggilan. Melewati argumen normal dengan nilai atau referensi umumnya akan menjadi yang paling efisien. Untuk banyak aplikasi meskipun kinerjanya tidak kritis tetapi untuk beberapa hal itu bisa saja.
sumber