Apakah mungkin untuk mengirim sejumlah variabel argumen ke fungsi JavaScript, dari sebuah array?
var arr = ['a','b','c']
var func = function()
{
// debug
alert(arguments.length);
//
for(arg in arguments)
alert(arg);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
Saya baru-baru ini menulis banyak Python dan itu adalah pola yang bagus untuk dapat menerima varargs dan mengirimkannya. misalnya
def func(*args):
print len(args)
for i in args:
print i
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(*arr) // prints 4 which is what I want, then 'a','b','c','d'
Apakah mungkin dalam JavaScript untuk mengirim array untuk diperlakukan sebagai array argumen?
javascript
variadic-functions
Fire Crow
sumber
sumber
for - in
loop denganarguments
objek - 'normal' untuk iterasi loop di ataslength
properti harus digunakan sebagai gantinyaJawaban:
Pembaruan : Sejak ES6, Anda cukup menggunakan sintaks penyebaran saat memanggil fungsi:
Karena ES6 juga jika Anda berharap untuk memperlakukan argumen Anda sebagai array, Anda juga dapat menggunakan sintaks spread dalam daftar parameter, misalnya:
Dan Anda dapat menggabungkannya dengan parameter normal, misalnya jika Anda ingin menerima dua argumen pertama secara terpisah dan sisanya sebagai array:
Dan mungkin bermanfaat bagi Anda, bahwa Anda dapat mengetahui berapa banyak argumen yang diharapkan oleh suatu fungsi:
Tapi bagaimanapun, Anda dapat melewati sejumlah argumen arbitrer ...
Sintaksis penyebaran lebih pendek dan "lebih manis" daripada
apply
dan jika Anda tidak perlu menetapkanthis
nilai dalam pemanggilan fungsi, inilah cara yang harus dilakukan.Berikut ini contoh yang berlaku , yang merupakan cara sebelumnya untuk melakukannya:
Saat ini saya hanya merekomendasikan menggunakan
apply
hanya jika Anda harus melewati sejumlah argumen dari array dan mengaturthis
nilainya.apply
take adalahthis
nilai sebagai argumen pertama, yang akan digunakan pada pemanggilan fungsi, jika kita menggunakannull
kode non-ketat,this
kata kunci akan merujuk ke objek Global (jendela) di dalamfunc
, dalam mode ketat, ketika secara eksplisit menggunakan 'gunakan ketat 'atau dalam modul ES,null
akan digunakan.Perhatikan juga bahwa
arguments
objek tersebut bukan Array, Anda dapat mengubahnya dengan:Dan dalam ES6:
Tetapi Anda jarang menggunakan
arguments
objek secara langsung saat ini berkat sintaksis penyebaran.sumber
Array.prototype.slice.call(arguments);
mencegah optimasi browser JS seperti V8. Detail di siniarguments
direncanakan akan ditinggalkan demi operator penyebaran . Saya tidak punya sumber untuk ini, tetapi saya mendengarnya di suatu tempat. 2. MDN negara yang menggunakanslice
padaarguments
optimasi objek mencegah di mesin seperti V8. Mereka menyarankan menggunakan "konstruktor Array yang dihina"Array.from(arguments)
,, atau[...arguments]
. Apakah Anda ingin memperbarui jawaban Anda untuk ES2015?Anda benar-benar dapat memberikan nilai sebanyak yang Anda inginkan ke fungsi javascript apa pun. Parameter yang dinamai secara eksplisit akan mendapatkan beberapa nilai pertama, tetapi SEMUA parameter akan disimpan dalam array argumen.
Untuk meneruskan array argumen dalam bentuk "tidak terbungkus", Anda dapat menggunakan apply, seperti: (cf Javascript Fungsional ):
sumber
Operator percikan dan spread adalah bagian dari ES6, versi Javascript yang direncanakan berikutnya. Sejauh ini hanya Firefox yang mendukung mereka. Kode ini berfungsi di FF16 +:
Perhatikan sintaks awkard untuk spread. Sintaks biasa
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
yang belum didukung . Anda dapat menemukan tabel kompatibilitas ES6 di sini .Perhatikan juga penggunaan
for...of
, tambahan ES6 lainnya. Menggunakanfor...in
untuk array adalah ide yang buruk .sumber
The
apply
Fungsi membutuhkan dua argumen; objekthis
akan diikat, dan argumen, diwakili dengan array.sumber
Ada dua metode pada ES2015.
The
arguments
ObjectObjek ini dibangun ke dalam fungsi-fungsi, dan itu merujuk pada, dengan tepat, argumen dari suatu fungsi. Secara teknis ini bukan array, jadi operasi array tipikal tidak akan bekerja di dalamnya. Metode yang disarankan adalah menggunakan
Array.from
atau operator spread untuk membuat array darinya.Saya telah melihat jawaban lain yang disebutkan menggunakan
slice
. Jangan lakukan itu. Ini mencegah optimasi (sumber: MDN ).Namun, saya berpendapat itu
arguments
bermasalah karena menyembunyikan apa fungsi menerima sebagai input. Suatuarguments
fungsi biasanya ditulis seperti ini:Kadang-kadang, header fungsi ditulis seperti berikut untuk mendokumentasikan argumen dengan gaya C-like:
Tapi itu jarang terjadi.
Adapun mengapa itu bermasalah, ambil C, misalnya. C kompatibel dengan dialek pra-ANSI kuno dari bahasa yang dikenal sebagai K&R C. K&R C memungkinkan prototipe fungsi memiliki daftar argumen kosong.
ANSI C menyediakan fasilitas untuk
varargs
(...
), danvoid
untuk menentukan daftar argumen kosong.Banyak orang secara tidak sengaja menyatakan fungsi dengan
unspecified
daftar argumen (int myfunction();
), ketika mereka mengharapkan fungsi untuk mengambil argumen nol. Secara teknis ini adalah bug karena fungsinya akan menerima argumen. Jumlah mereka.varargs
Fungsi yang tepat dalam C berbentuk:Dan JavaScript sebenarnya memiliki sesuatu yang mirip dengan ini.
Sebarkan Parameter Operator / Istirahat
Saya sudah menunjukkan kepada Anda operator spread, sebenarnya.
Ini cukup serbaguna, dan juga dapat digunakan dalam daftar argumen fungsi ("parameter rest") untuk menentukan vararg dengan cara yang terdokumentasi dengan baik:
Atau sebagai ungkapan lambda:
Saya lebih suka operator spread. Itu bersih dan mendokumentasikan diri.
sumber
Ini disebut
splat
operator. Anda dapat melakukannya dalam JavaScript menggunakanapply
:sumber
Dengan ES6 Anda dapat menggunakan parameter istirahat untuk
varagrs
. Ini mengambil daftar argumen dan mengubahnya menjadi sebuah array.sumber
Ini adalah contoh program untuk menghitung jumlah integer untuk argumen variabel dan array pada integer. Semoga ini membantu.
sumber
var
mendeklarasikanfunction scope
variabel. Yang barulet
danconst
kata kunci (ES 2015) mendeklarasikanblock scope
variabel. Namun, sebelum ES 2015, variabel-variabel tersebut seharusnya masih diangkat ke atas fungsi sebagai praktik. 2. istirahat fungsi Anda ketika diberikan 1 nilai integer karena penerimaan yang keliru Anda dari sebuah array sebagai argumen (pertanyaan menanyakan tentang varargs; tidak menerima array sebagai argumen):CalculateSum(6) -> 0
. (lanjutan di posting berikutnya)alert
. Sebenarnya, jangan gunakanalert/prompt/confirm
, titik. Gunakanconsole.log
sebaliknya saat debugging. 4. Fungsi harus berupareturn
nilai, bukanalert
nilai. 5. hindariPascalCase
kecuali jika mengacu pada "tipe" data. Yaitu sebuah kelas. GunakancamelCase
atauunder_score
sebagai gantinya. 4. Saya tidak suka cara Anda mendeklarasikan fungsi Anda.var f = function(){ ... }
menyiratkan bahwa Anda ingin itu berubah di beberapa titik, yang mungkin bukan niat Anda. Gunakanfunction name(){ ... }
sintaksis konvensional sebagai gantinya.sumber
Bagi mereka yang dialihkan ke sini dari Melewati jumlah variabel argumen dari satu fungsi ke fungsi lainnya (yang tidak boleh ditandai sebagai duplikat dari pertanyaan ini):
Jika Anda mencoba meneruskan sejumlah variabel argumen dari satu fungsi ke fungsi lainnya, karena JavaScript 1.8.5 Anda cukup memanggil
apply()
fungsi kedua dan meneruskanarguments
parameternya:Catatan: Argumen pertama adalah
this
parameter yang digunakan. Passingnull
akan memanggil fungsi dari konteks global, yaitu sebagai fungsi global alih-alih metode dari beberapa objek.Menurut dokumen ini , spesifikasi ECMAScript 5 mendefinisikan ulang
apply()
metode untuk mengambil "objek mirip array generik", alih-alih hanya sebuah Array. Dengan demikian, Anda bisa langsung meneruskanarguments
daftar ke fungsi kedua.Diuji di Chrome 28.0, Safari 6.0.5, dan IE 10. Cobalah dengan JSFiddle ini .
sumber
Ya, Anda dapat melewati variabel no. argumen ke suatu fungsi. Anda dapat menggunakannya
apply
untuk mencapai ini.Misalnya:
sumber
Apakah Anda ingin fungsi Anda bereaksi terhadap argumen array atau argumen variabel? Jika yang terakhir, coba:
Tetapi jika Anda ingin menangani argumen array
sumber