Ini hanya berfungsi untuk JavaScript tradisional function, bukan =>fungsi panah gemuk ES2015 + . Bagi mereka, Anda akan ingin menggunakan ...argsdalam definisi fungsi seperti: (...args) => console.log(args).
function testArguments ()// <-- notice no arguments specified{
console.log(arguments);// outputs the arguments to the consolevar htmlOutput ="";for(var i=0; i < arguments.length; i++){
htmlOutput +='<li>'+ arguments[i]+'</li>';}
document.write('<ul>'+ htmlOutput +'</ul>');}
Mengapa tidak memposting hasilnya di sini juga? :)
Jonathan Azulay
2
Ini jauh lebih baik daripada jawaban yang diterima karena berisi potongan kode yang berfungsi dan menampilkan output. Jawaban yang diterima terlalu jarang.
Mac
Jawaban yang bagus ... akan menjadi jawaban yang bagus dengan memperluas pada "bukan array yang sebenarnya"
terpinmd
Saya menambahkan tautan ke deskripsi sederhana: "Objek Array-like" hanyalah "Obyek yang memiliki properti panjang dari Integer non-negatif, dan biasanya beberapa properti yang diindeks." Dari tautan mozilla: "Ini mirip dengan Array, tetapi tidak memiliki properti Array apa pun kecuali panjang."
Luke
31
ES6 memungkinkan konstruk di mana argumen fungsi ditentukan dengan notasi "..." seperti
function testArgs (...args){// Where you can test picking the first element
console.log(args[0]);}
Ini tampaknya menjadi satu-satunya cara ketika menggunakan fungsi panah. a = () => {console.log(arguments);}; a('foo');memberikan -- Uncaught ReferenceError: arguments is not defined Namun a = (...args) => {console.log(args);}; a('foo');memberi["foo"]
David Baucum
1
@ DavidBaucum itu benar. Karena fungsi panah tidak membuat ruang lingkup baru, dan "argumen" dikumpulkan dari ruang lingkup. Tetapi skenario terburuk bukanlah ReferenceError. Itu adalah bahwa "argumen" dikumpulkan dari ruang lingkup luar. Maka Anda tidak terkecuali, dan mungkin ada bug aneh di aplikasi Anda.
Terima kasih atas pembaruannya. Gunakan JSON.stringify dan JSON.parse sebagai alternatif: function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } Jika pelestarian diperlukan alih-alih pengencangan, gunakan algoritma kloning terstruktur internal . Jika node DOM dilewatkan, gunakan XMLSerializer seperti dalam pertanyaan yang tidak terkait . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Paul Sweatte
7
Seperti yang banyak ditunjukkan, argumentsberisi semua argumen yang diteruskan ke fungsi.
Jika Anda ingin memanggil fungsi lain dengan argumen yang sama, gunakan apply
Contoh:
var is_debug =true;var debug =function(){if(is_debug){
console.log.apply(console, arguments);}}
debug("message","another argument")
Jawaban yang mirip dengan Gunnar, dengan contoh yang lebih lengkap: Anda bahkan dapat mengembalikan semuanya secara transparan:
function dumpArguments(...args){for(var i =0; i < args.length; i++)
console.log(args[i]);return args;}
dumpArguments("foo","bar",true,42,["yes","no"],{'banana':true});
Ya jika Anda tidak tahu bahwa berapa banyak argumen yang mungkin pada saat deklarasi fungsi maka Anda dapat mendeklarasikan fungsi tersebut tanpa parameter dan dapat mengakses semua variabel dengan array argumen yang diteruskan pada saat pemanggilan fungsi.
Jika berjalan sebagai bookmarklet, Anda mungkin perlu membungkus masing-masing argumen data terstruktur dalam konstruktor Kesalahan JSON.stringifyagar berfungsi dengan benar.
Pertama: ini akan mengkloning objek apa pun yang dilewatkan. Kedua: tidak semuanya dapat dirender ke JSON. Yaitu: fungsi, objek DOM, kata tanggal dirangkai sebagai string ...
John Dvorak
@ JanDvorak Bisakah Anda mengedit jawaban saya dengan fungsi yang menangani objek, fungsi, dan tanggal DOM?
Paul Sweatte
1
+1, mencoba meneruskan argumen untuk pelaporan kesalahan sebagai string, objek berakhir sebagai string '[argumen objek]' dan masuk ke konsol tidak menampilkan nilai. Meskipun sepertinya tidak menjawab OP, ia menjawab pertanyaan saya, terima kasih!
function
, bukan=>
fungsi panah gemuk ES2015 + . Bagi mereka, Anda akan ingin menggunakan...args
dalam definisi fungsi seperti:(...args) => console.log(args)
.The argumen adalah sebuah objek array-seperti (bukan array yang sebenarnya). Fungsi contoh ...
Cobalah ...
Detail lengkap: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
sumber
ES6 memungkinkan konstruk di mana argumen fungsi ditentukan dengan notasi "..." seperti
sumber
a = () => {console.log(arguments);}; a('foo');
memberikan-- Uncaught ReferenceError: arguments is not defined
Namuna = (...args) => {console.log(args);}; a('foo');
memberi["foo"]
The
arguments
objek adalah di mana argumen fungsi disimpan.Objek argumen bertindak dan terlihat seperti array, pada dasarnya adalah, hanya saja tidak memiliki metode yang dilakukan array, misalnya:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.slice(begin[, end])
Array.indexOf(searchElement[, fromIndex])
Saya pikir cara terbaik untuk mengubah
arguments
objek menjadi Array nyata adalah seperti ini:Itu akan membuatnya menjadi array;
dapat digunakan kembali:
hasil:
sumber
[].slice.apply(arguments);
tidak bisa menjadi cara terbaik karena menyebabkan alokasi array kosong yang tidak perlu.Anda juga dapat mengonversinya menjadi sebuah array jika Anda mau. Jika Array generics tersedia:
Jika tidak:
dari Mozilla MDN :
sumber
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
Jika pelestarian diperlukan alih-alih pengencangan, gunakan algoritma kloning terstruktur internal . Jika node DOM dilewatkan, gunakan XMLSerializer seperti dalam pertanyaan yang tidak terkait .with (new XMLSerializer()) {serializeToString(document.documentElement) }
Seperti yang banyak ditunjukkan,
arguments
berisi semua argumen yang diteruskan ke fungsi.Jika Anda ingin memanggil fungsi lain dengan argumen yang sama, gunakan
apply
Contoh:
sumber
Jawaban yang mirip dengan Gunnar, dengan contoh yang lebih lengkap: Anda bahkan dapat mengembalikan semuanya secara transparan:
Keluaran:
https://codepen.io/fnocke/pen/mmoxOr?editors=0010
sumber
Ya jika Anda tidak tahu bahwa berapa banyak argumen yang mungkin pada saat deklarasi fungsi maka Anda dapat mendeklarasikan fungsi tersebut tanpa parameter dan dapat mengakses semua variabel dengan array argumen yang diteruskan pada saat pemanggilan fungsi.
sumber
Di ES6 Anda dapat melakukan sesuatu seperti ini:
sumber
Dalam ES6, gunakan
Array.from
:Untuk kode non-ES6, gunakan JSON.stringify dan JSON.parse:
Jika pelestarian diperlukan alih-alih pengencangan, gunakan algoritma kloning terstruktur internal .
Jika node DOM dilewatkan, gunakan XMLSerializer seperti dalam pertanyaan yang tidak terkait .
Jika berjalan sebagai bookmarklet, Anda mungkin perlu membungkus masing-masing argumen data terstruktur dalam konstruktor Kesalahan
JSON.stringify
agar berfungsi dengan benar.Referensi
Modul Struktur Klon CommonJS
Klon Objek JS
MDN: Array.from ()
sumber