Ada dua metode pada ES2015.
Objek 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 ).
Array.from(arguments)
[...arguments]
Namun, saya berpendapat itu arguments
bermasalah karena menyembunyikan apa fungsi menerima sebagai input. Suatu arguments
fungsi biasanya ditulis seperti ini:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
Kadang-kadang, header fungsi ditulis seperti berikut untuk mendokumentasikan argumen dengan gaya C-like:
function mean(/* ... */){ ... }
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.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C menyediakan fasilitas untuk varargs
( ...
), dan void
untuk menentukan daftar argumen kosong.
int myFunction(void);
/* This function accepts no parameters */
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:
int myFunction(int nargs, ...);
Dan JavaScript sebenarnya memiliki sesuatu yang mirip dengan ini.
Saya sudah menunjukkan kepada Anda operator spread, sebenarnya.
...name
Ini cukup serbaguna, dan juga dapat digunakan dalam daftar argumen fungsi ("parameter rest") untuk menentukan vararg dengan cara yang terdokumentasi dengan baik:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
Atau sebagai ungkapan lambda:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
Saya lebih suka operator spread. Itu bersih dan mendokumentasikan diri.
for - in
loop denganarguments
objek - 'normal' untuk iterasi loop di ataslength
properti harus digunakan sebagai gantinya