arguments
Obiektu w JavaScript jest nieparzystą brodawka-to działa podobnie jak tablicy w większości sytuacji, ale to nie jest faktycznie przedmiotem tablicą. Ponieważ jest to naprawdę coś zupełnie innego , to nie ma użytecznych funkcji z Array.prototype
niczym forEach
, sort
, filter
, i map
.
Łatwo jest zbudować nową tablicę z obiektu argumentów za pomocą prostej pętli for. Na przykład ta funkcja sortuje argumenty:
function sortArgs() {
var args = [];
for (var i = 0; i < arguments.length; i++)
args[i] = arguments[i];
return args.sort();
}
Jest to jednak dość żałosne, aby zrobić to, aby uzyskać dostęp do niezwykle użytecznych funkcji tablicy JavaScript. Czy istnieje wbudowany sposób, aby to zrobić przy użyciu standardowej biblioteki?
javascript
arrays
sorting
arguments
variadic-functions
Andrew Coleson
źródło
źródło
Odpowiedzi:
ES6 przy użyciu parametrów odpoczynku
Jeśli możesz korzystać z ES6, możesz użyć:
Parametry odpoczynku
Jak można przeczytać w linku
Jeśli ciekawi Cię
...
składnia, nazywa się ona Spread Operator i możesz przeczytać więcej tutaj .ES6 przy użyciu Array.from ()
Za pomocą Array.from :
Array.from
po prostu przekształć obiekty podobne do macierzy lub iterowalne w instancje macierzy.ES5
Rzeczywiście można po prostu użyć
Array
„sslice
funkcję obiektu argumenty i będzie przekształcić go w standardowej tablicy JavaScript. Musisz tylko odwołać się do niego ręcznie za pomocą prototypu Array:Dlaczego to działa? Cóż, oto fragment z samej dokumentacji ECMAScript 5 :
Dlatego
slice
działa na wszystkim, co malength
właściwość, coarguments
wygodnie robi.Gdyby
Array.prototype.slice
jest to dla Ciebie zbyt duże, możesz je skrócić, używając literałów tablicowych:Jednak wydaje mi się, że poprzednia wersja jest bardziej wyraźna, więc wolałbym ją zamiast tego. Nadużywanie tablicowej notacji dosłownie wydaje się dziwne i wygląda dziwnie.
źródło
0
za? Ponieważ nie ma argumentów, które chcesz przekazać, dlaczego nie możesz po prostu użyćvar args = Array.prototype.slice.call(arguments);
? [ Strona argumentów MDC ] ( developer.mozilla.org/en/JavaScript/Reference/… ) sugeruje metodę bez0
.function sortArgs(...argsToSort) { return argsToSort.sort(); }
od MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Warto również odwołać się do strony wiki obiecującej biblioteki Bluebird, która pokazuje, jak zarządzać
arguments
obiektem w tablicy w sposób, który umożliwia optymalizację funkcji w silniku JavaScript V8 :Ta metoda jest używana na korzyść
var args = [].slice.call(arguments);
. Autor pokazuje również, w jaki sposób krok kompilacji może pomóc w zmniejszeniu szczegółowości.źródło
Niektóre metody tablicowe są celowo tworzone tak, aby obiekt docelowy nie był rzeczywistą tablicą. Wymagają jedynie, aby cel miał właściwość o nazwie długość i indeksy (które muszą być zerowymi lub większymi liczbami całkowitymi).
źródło
Posługiwać się:
Array(arg1, arg2, ...)
zwroty[arg1, arg2, ...]
Array(str1)
zwroty[str1]
Array(num1)
zwraca tablicę, która manum1
elementyMusisz sprawdzić liczbę argumentów!
Array.slice
wersja (wolniejsza):Array.push
wersja (wolniejsza, szybsza niż plasterek):Przenieś wersję (wolniej, ale mały rozmiar jest szybszy):
Array.concat
wersja (najwolniejsza):źródło
Jeśli używasz jQuery, moim zdaniem o wiele łatwiej jest zapamiętać:
źródło
W ECMAScript 6 nie trzeba używać takich brzydkich hacków jak
Array.prototype.slice()
. Zamiast tego możesz użyć spread syntax (...
) .Może to wyglądać dziwnie, ale jest dość proste. Po prostu wyodrębnia
arguments
elementy i umieszcza je z powrotem w tablicy. Jeśli nadal nie rozumiesz, zapoznaj się z tymi przykładami:Pamiętaj, że nie działa w niektórych starszych przeglądarkach, takich jak IE 11, więc jeśli chcesz obsługiwać te przeglądarki, powinieneś użyć Babel .
źródło
Oto punkt odniesienia dla kilku metod przekształcających argumenty w tablicę.
Jeśli chodzi o mnie, najlepszym rozwiązaniem dla małej liczby argumentów jest:
W innych przypadkach:
źródło
sortArgs
Firefox jest 6 razy szybszy w Firefoksie, ale dwa razy wolniejszy w najnowszym Chrome, w porównaniu doArray.apply
.Polecam użycie operatora rozprzestrzeniania ECMAScript 6 , który powiąże końcowe parametry z tablicą. Dzięki temu rozwiązaniu nie musisz dotykać
arguments
obiektu, a Twój kod zostanie uproszczony. Minusem tego rozwiązania jest to, że nie działa w większości przeglądarek, więc zamiast tego będziesz musiał użyć kompilatora JS, takiego jak Babel. Pod maską Babel przekształcaarguments
się w tablicę z pętlą for.Jeśli nie możesz użyć ECMAScript 6, polecam przyjrzeć się innym odpowiedziom, takim jak @Jathanathan Fingland
źródło
Lodash:
w akcji:
produkuje:
źródło
_.toArray
?_.toArray
jest bardziej odpowiednie.Użyj
Array.from()
, która przyjmujearguments
jako argument obiekt podobny do tablicy (np. ) I konwertuje go na tablicę:Pamiętaj, że nie działa w niektórych starszych przeglądarkach, takich jak IE 11, więc jeśli chcesz obsługiwać te przeglądarki, powinieneś użyć Babel .
źródło
źródło
Kolejna odpowiedź.
Użyj zaklęć Czarnej Magii:
Firefox, Chrome, Node.js, IE11 są w porządku.
źródło
__proto__
przestarzałe. Zobacz dokumenty MDN .Spróbuj użyć
Object.setPrototypeOf()
Objaśnienia: Ustaw
prototype
odarguments
doArray.prototype
Objaśnienie: Weź każdy indeks
arguments
, umieść element w tablicy pod odpowiednim indeksem tablicy.może alternatywnie użyć
Array.prototype.map()
Objaśnienie: Weź każdy indeks
arguments
, umieść element w tablicy pod odpowiednim indeksem tablicy.for..of
pętlalub
Object.create()
Objaśnienie: Utwórz obiekt, ustaw właściwości obiektu na elementy przy każdym indeksie
arguments
; zestawprototype
utworzonego obiektu doArray.prototype
źródło
Object.setPrototypeOf
ostrzega, że jest to „bardzo wolna operacja”. Dlaczego, u licha, miałbym to wykorzystaćArray.prototype.slice.call
?Oto czyste i zwięzłe rozwiązanie:
Object.values( )
zwróci wartości obiektu jako tablicę, a ponieważarguments
jest obiektem, zasadniczo się skonwertujearguments
do tablicy, tym samym umożliwiając korzystanie z wszystkich funkcji pomocniczych tablicy, takich jakmap
,forEach
,filter
, itd.źródło
Metody Benshmarcka 3:
WYNIK?
Cieszyć się !
źródło
arguments.length == 1?[arguments[0]]:Array.apply(null, arguments);
aby zapobiec wywołaniu funkcji z tylko jednym argumentem liczby całkowitejdummyFn(3)
i powoduje wynik[,,]
dummyFn(3)
co to jest? ta funkcja nie istnieje ...źródło
Chociaż parametry odpoczynku działają dobrze, jeśli chcesz nadal używać
arguments
z jakiegoś powodu , rozważ to[...arguments]
można uznać za rodzaj alternatywy dlaArray.from(arguments)
, która również działa doskonale.Alternatywą dla ES7 jest rozumienie tablic:
Może to być najłatwiejsze, jeśli chcesz przetwarzać lub filtrować argumenty przed sortowaniem:
źródło
Próbowałem prostej techniki niszczenia
źródło
Obiekt Arguments jest dostępny tylko w treści funkcji. Chociaż można indeksować obiekt argumentów jak tablicę, nie jest to tablica. Nie ma żadnych właściwości tablicy innych niż długość.
Chociaż może być indeksowany jak tablica, jak widać w tym przykładzie:
Jednak obiekt Arguments nie jest tablicą i nie ma żadnych innych właściwości poza długością.
Możesz przekonwertować obiekt argumentów na tablicę, w której możesz uzyskać dostęp do obiektu Arguments.
Istnieje wiele sposobów dostępu do obiektu argumentów w ciele funkcji, a są to:
Array.prototype.slice.call (argumenty)
[] .slice.call (argumenty).
źródło
Możesz utworzyć funkcję wielokrotnego użytku, aby zrobić to z dowolnymi argumentami, najprostsza jest taka:
Rozkładaną składnię można zastosować w ES6 i nowszych ...
Ale jeśli chcesz użyć czegoś zgodnego z ES5 i niższymi wersjami , możesz użyć
Array.prototype.slice.call
, więc kod wygląda następująco:Istnieje również kilka innych sposobów, aby to zrobić, na przykład używając
Array.from
lub zapętlając argumenty i przypisując je do nowej tablicy ...źródło
To bardzo stare pytanie, ale myślę, że mam rozwiązanie, które jest nieco łatwiejsze do pisania niż poprzednie rozwiązania i nie opiera się na bibliotekach zewnętrznych:
źródło
Array.apply
nie będzie działać, jeśli masz tylko jeden argument dodatniej liczby całkowitej. To dlatego, żenew Array(3)
tworzy tablicę o długości3
. Mówiąc ściślej, wynik będzie[undefined, undefined, undefined]
i nie[3]
.