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.fromatau 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 argumentsbermasalah karena menyembunyikan apa fungsi menerima sebagai input. Suatu argumentsfungsi 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 voiduntuk menentukan daftar argumen kosong.
int myFunction(void);
/* This function accepts no parameters */
Banyak orang secara tidak sengaja menyatakan fungsi dengan unspecifieddaftar argumen ( int myfunction();), ketika mereka mengharapkan fungsi untuk mengambil argumen nol. Secara teknis ini adalah bug karena fungsinya akan menerima argumen. Jumlah mereka.
varargsFungsi 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 - inloop denganargumentsobjek - 'normal' untuk iterasi loop di ataslengthproperti harus digunakan sebagai gantinya