The arguments
obyek dalam JavaScript adalah kutil-aneh bertindak seperti sebuah array dalam kebanyakan situasi, tapi itu tidak benar-benar sebuah objek array. Karena itu benar-benar sesuatu yang lain sama sekali , tidak memiliki fungsi yang berguna dari Array.prototype
seperti forEach
, sort
, filter
, dan map
.
Sangat mudah untuk membangun array baru dari objek argumen dengan simpel untuk loop. Misalnya, fungsi ini mengurutkan argumennya:
function sortArgs() {
var args = [];
for (var i = 0; i < arguments.length; i++)
args[i] = arguments[i];
return args.sort();
}
Namun, ini adalah hal yang agak menyedihkan yang harus dilakukan hanya untuk mendapatkan akses ke fungsi array JavaScript yang sangat berguna. Apakah ada cara bawaan untuk melakukannya menggunakan pustaka standar?
javascript
arrays
sorting
arguments
variadic-functions
Andrew Coleson
sumber
sumber
Jawaban:
ES6 menggunakan parameter istirahat
Jika Anda dapat menggunakan ES6, Anda dapat menggunakan:
Parameter Istirahat
Seperti yang dapat Anda baca di tautan
Jika Anda penasaran dengan
...
sintaksnya, ini disebut Penyebar Operator dan Anda dapat membaca lebih lanjut di sini .ES6 menggunakan Array.from ()
Menggunakan Array.from :
Array.from
cukup konversi objek seperti Array atau Iterable ke dalam instance Array.ES5
Anda benar-benar dapat hanya menggunakan
Array
'sslice
fungsi pada objek argumen, dan itu akan mengubahnya menjadi array JavaScript standar. Anda hanya perlu merujuknya secara manual melalui prototipe Array:Mengapa ini bekerja? Nah, inilah kutipan dari dokumentasi ECMAScript 5 itu sendiri :
Oleh karena itu,
slice
bekerja pada apa pun yang memilikilength
properti, yangarguments
nyaman melakukannya.Jika
Array.prototype.slice
terlalu sulit untuk Anda, Anda bisa menyingkatnya sedikit dengan menggunakan literal array:Namun, saya cenderung merasa bahwa versi sebelumnya lebih eksplisit, jadi saya lebih suka itu. Menyalahgunakan array notasi literal terasa hacky dan terlihat aneh.
sumber
0
? Karena tidak ada argumen yang ingin Anda sampaikan, mengapa Anda tidak bisa menggunakan sajavar args = Array.prototype.slice.call(arguments);
? [ Halaman argumen MDC ] ( developer.mozilla.org/en/JavaScript/Reference/… ) menyarankan metode tanpa0
.function sortArgs(...argsToSort) { return argsToSort.sort(); }
dari MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Layak juga merujuk pada halaman wiki Bluebird menjanjikan perpustakaan ini yang menunjukkan cara mengelola
arguments
objek ke dalam array dengan cara yang membuat fungsi dioptimalkan di bawah mesin JavaScript V8 :Metode ini digunakan untuk mendukung
var args = [].slice.call(arguments);
. Penulis juga menunjukkan bagaimana langkah pembangunan dapat membantu mengurangi verbositas.sumber
Beberapa metode array sengaja dibuat untuk tidak memerlukan objek target menjadi array yang sebenarnya. Mereka hanya membutuhkan target untuk memiliki properti bernama panjang dan indeks (yang harus nol atau bilangan bulat lebih besar).
sumber
Menggunakan:
Array(arg1, arg2, ...)
kembali[arg1, arg2, ...]
Array(str1)
kembali[str1]
Array(num1)
mengembalikan array yang memilikinum1
elemenAnda harus memeriksa sejumlah argumen!
Array.slice
versi (lebih lambat):Array.push
versi (lebih lambat, lebih cepat dari slice):Pindahkan versi (lebih lambat, tetapi ukuran kecil lebih cepat):
Array.concat
versi (paling lambat):sumber
Jika Anda menggunakan jQuery, yang berikut ini lebih mudah diingat menurut saya:
sumber
Dalam ECMAScript 6 tidak perlu menggunakan hacks jelek seperti
Array.prototype.slice()
. Anda bisa menggunakan sintaks spread (...
) .Ini mungkin terlihat aneh, tetapi cukup sederhana. Itu hanya mengekstrak
arguments
elemen dan mengembalikannya ke dalam array. Jika Anda masih tidak mengerti, lihat contoh ini:Perhatikan bahwa itu tidak berfungsi di beberapa browser lama seperti IE 11, jadi jika Anda ingin mendukung browser ini, Anda harus menggunakan Babel .
sumber
Berikut ini adalah beberapa metode untuk mengubah argumen menjadi array.
Bagi saya, solusi terbaik untuk sejumlah kecil argumen adalah:
Untuk kasus lain:
sumber
sortArgs
6 kali lebih cepat di Firefox, tetapi dua kali lebih lambat di Chrome terbaru, dibandingkan denganArray.apply
.Saya sarankan menggunakan operator spread ECMAScript 6 , yang akan Mengikat parameter trailing ke array. Dengan solusi ini Anda tidak perlu menyentuh
arguments
objek dan kode Anda akan disederhanakan. Kelemahan dari solusi ini adalah tidak berfungsi di sebagian besar browser, jadi Anda harus menggunakan kompiler JS seperti Babel. Di bawah kap Babel berubaharguments
menjadi Array dengan for for loop.Jika Anda tidak dapat menggunakan ECMAScript 6, saya sarankan melihat beberapa jawaban lain seperti @Jonathan Fingland
sumber
Lodash:
dalam aksi:
menghasilkan:
sumber
_.toArray
?_.toArray
lebih tepat.Gunakan
Array.from()
, yang mengambil objek mirip array (sepertiarguments
) sebagai argumen dan mengubahnya menjadi array:Perhatikan bahwa itu tidak berfungsi di beberapa browser lama seperti IE 11, jadi jika Anda ingin mendukung browser ini, Anda harus menggunakan Babel .
sumber
sumber
Jawaban Lain.
Gunakan Mantra Sihir Hitam:
Firefox, Chrome, Node.js, IE11 tidak masalah.
sumber
__proto__
sudah usang. Lihat dokumen MDN .Coba gunakan
Object.setPrototypeOf()
Penjelasan: Set
prototype
dariarguments
keArray.prototype
Penjelasan: Ambil setiap indeks
arguments
, tempatkan item ke dalam array di indeks array yang sesuai.sebagai alternatif bisa digunakan
Array.prototype.map()
Penjelasan: Ambil setiap indeks
arguments
, tempatkan item ke dalam array di indeks array yang sesuai.for..of
lingkaranatau
Object.create()
Penjelasan: Buat objek, atur properti objek ke item pada setiap indeks
arguments
; setprototype
objek yang dibuat keArray.prototype
sumber
Object.setPrototypeOf
peringatan bahwa itu adalah "operasi yang sangat lambat". Kenapa aku harus menggunakan iniArray.prototype.slice.call
?Inilah solusi yang bersih dan ringkas:
Object.values( )
akan mengembalikan nilai-nilai dari sebuah objek sebagai array, dan karenaarguments
merupakan objek, pada dasarnya akan mengkonversiarguments
ke dalam array, sehingga memberikan Anda dengan semua fungsi pembantu array ini sepertimap
,forEach
,filter
, dllsumber
Metode Benshmarck 3:
HASIL?
Nikmati !
sumber
arguments.length == 1?[arguments[0]]:Array.apply(null, arguments);
untuk mencegah fungsi dipanggil dengan hanya satu argumen integerdummyFn(3)
dan menyebabkan hasil[,,]
dummyFn(3)
apa ini? fungsi ini tidak ada ...sumber
Meskipun parameter istirahat berfungsi dengan baik, jika Anda ingin terus menggunakan
arguments
untuk beberapa alasan, pertimbangkan[...arguments]
dapat dianggap semacam alternatifArray.from(arguments)
, yang juga berfungsi dengan baik.Alternatif ES7 adalah pemahaman array:
Ini bisa termudah jika Anda ingin memproses atau memfilter argumen sebelum mengurutkan:
sumber
Saya mencoba teknik penghancuran sederhana
sumber
Objek argumen hanya tersedia di dalam fungsi tubuh. Meskipun Anda bisa mengindeks Objek Argumen seperti array, itu bukan array. Tidak memiliki properti array selain panjang.
Meskipun dapat diindeks seperti array seperti yang Anda lihat dalam contoh ini:
Namun, objek Argumen bukan array dan tidak memiliki properti lain selain panjang.
Anda bisa mengonversi objek argumen menjadi array di titik mana Anda dapat mengakses objek argumen.
Ada banyak cara Anda dapat mengakses objek argumen di dalam tubuh fungsi, dan ini termasuk:
Array.prototype.slice.call (argumen)
[] .slice.call (argumen).
sumber
Anda dapat membuat fungsi yang dapat digunakan kembali untuk melakukannya dengan argumen apa pun, yang paling sederhana adalah sesuatu seperti ini:
Sintaks penyebaran dapat digunakan dalam ES6 dan di atas ...
Tetapi jika Anda ingin menggunakan sesuatu yang kompatibel dengan ES5 dan di bawah, Anda dapat menggunakan
Array.prototype.slice.call
, sehingga kode Anda terlihat seperti ini:Ada juga beberapa cara lain untuk melakukan ini, untuk Contoh menggunakan
Array.from
atau loop melalui argumen dan menetapkannya ke array baru ...sumber
Ini adalah pertanyaan yang sangat lama, tetapi saya rasa saya memiliki solusi yang sedikit lebih mudah untuk diketik daripada solusi sebelumnya dan tidak bergantung pada perpustakaan eksternal:
sumber
Array.apply
tidak akan berfungsi jika Anda hanya memiliki satu argumen bilangan bulat positif. Itu karenanew Array(3)
menciptakan panjang array3
. Untuk lebih spesifik hasilnya akan[undefined, undefined, undefined]
dan tidak[3]
.