Działa to tylko w przypadku tradycyjnego JavaScript function, a nie =>funkcji strzałek tłuszczu w wersji ES2015 + . Dla tych, będziesz chce wykorzystać ...argsw definicji funkcji tak: (...args) => console.log(args).
Sawtaytoes
141
Te argumenty są przedmiotem tablicowej (nie rzeczywisty tablica). Przykładowa funkcja ...
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>');}
Jest to znacznie lepsze niż zaakceptowana odpowiedź, ponieważ zawiera działający fragment kodu i pokazuje wynik. Przyjęta odpowiedź jest zbyt rzadka.
Mac
Dobra odpowiedź ... byłaby świetną odpowiedzią na rozwinięcie „nie faktycznej tablicy”
terpinmd
Dodałem link do prostego opisu: „Obiekt podobny do tablicy” to po prostu „Obiekt, który ma właściwość length nieujemnej liczby całkowitej i zwykle niektóre indeksowane właściwości”. Z linku mozilla: „Jest podobny do tablicy, ale nie ma żadnych właściwości tablicy poza długością”.
Łukasz
31
ES6 pozwala na konstrukcję, w której argument funkcji jest określony za pomocą notacji „...”, takiej jak
function testArgs (...args){// Where you can test picking the first element
console.log(args[0]);}
Wydaje się, że jest to jedyny sposób korzystania z funkcji strzałek. a = () => {console.log(arguments);}; a('foo');daje -- Uncaught ReferenceError: arguments is not defined Jednak a = (...args) => {console.log(args);}; a('foo');daje["foo"]
David Baucum
1
@DavidBaucum, które są poprawne. Ponieważ funkcja strzałki nie tworzy nowego zakresu, a „argumenty” są zbierane z zakresu. Ale najgorszym scenariuszem nie jest błąd ReferenceError. Chodzi o to, że „argumenty” są zbierane z zakresu zewnętrznego. Wtedy nie otrzymasz wyjątku, a może dziwne błędy w twojej aplikacji.
Dziękuję za aktualizację. Użyj JSON.stringify i JSON.parse jako alternatywy: function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } Jeśli zachodzi potrzeba zachowania zamiast sznurowania, użyj wewnętrznego algorytmu klonowania strukturalnego . Jeśli węzły DOM zostaną przekazane, użyj XMLSerializer jak w niepowiązanym pytaniu . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Paul Sweatte,
7
Jak wielu zauważyło, arguments zawiera wszystkie argumenty przekazane do funkcji.
Jeśli chcesz wywołać inną funkcję z tymi samymi argumentami, użyj apply
Przykład:
var is_debug =true;var debug =function(){if(is_debug){
console.log.apply(console, arguments);}}
debug("message","another argument")
Podobna odpowiedź do Gunnara, z bardziej kompletnym przykładem: Możesz nawet w przejrzysty sposób zwrócić całość:
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});
Tak, jeśli nie masz pojęcia, ile argumentów jest możliwych w momencie deklaracji funkcji, możesz zadeklarować funkcję bez parametrów i uzyskać dostęp do wszystkich zmiennych za pomocą tablicy argumentów przekazywanych w momencie wywołania funkcji.
Jeśli działa jako bookmarklet, może być konieczne zawinięcie każdego argumentu danych strukturalnych w konstruktora błędów dla JSON.stringify aby działał poprawnie.
Po pierwsze: spowoduje to sklonowanie wszystkich przekazanych obiektów. Po drugie: nie wszystko można powiązać z JSON. Mianowicie: funkcje, obiekty DOM, wspomniane daty są traktowane jako ciągi znaków
John Dvorak
@JanDvorak Czy możesz edytować moją odpowiedź za pomocą funkcji, która obsługuje obiekty DOM, funkcje i daty?
Paul Sweatte
1
+1, próbując przekazać argumenty do zgłaszania błędów jako ciąg, obiekt kończy się jako ciąg „[argumenty obiektu]” i zalogowanie go do konsoli nie wyświetla wartości. Chociaż wydaje się, że nie odpowiada na OP, odpowiada na moje pytanie, dzięki!
function
, a nie=>
funkcji strzałek tłuszczu w wersji ES2015 + . Dla tych, będziesz chce wykorzystać...args
w definicji funkcji tak:(...args) => console.log(args)
.Te argumenty są przedmiotem tablicowej (nie rzeczywisty tablica). Przykładowa funkcja ...
Wypróbuj to...
Pełne szczegóły: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
źródło
ES6 pozwala na konstrukcję, w której argument funkcji jest określony za pomocą notacji „...”, takiej jak
źródło
a = () => {console.log(arguments);}; a('foo');
daje-- Uncaught ReferenceError: arguments is not defined
Jednaka = (...args) => {console.log(args);}; a('foo');
daje["foo"]
arguments
Obiekt jest gdzie przechowywane są argumenty funkcji.Obiekt argumentów działa i wygląda jak tablica, po prostu nie ma metod, które wykonują tablice, na przykład:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.slice(begin[, end])
Array.indexOf(searchElement[, fromIndex])
Myślę, że najlepszym sposobem na konwersję
arguments
obiektu do prawdziwej macierzy jest:To sprawi, że będzie tablicą;
wielokrotnego użytku:
wynik:
źródło
[].slice.apply(arguments);
nie może być najlepszym sposobem, ponieważ powoduje niepotrzebne przydzielanie pustej tablicy.Możesz także przekonwertować go na tablicę, jeśli wolisz. Jeśli dostępne są ogólne tablice:
Inaczej:
z Mozilla MDN :
źródło
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
Jeśli zachodzi potrzeba zachowania zamiast sznurowania, użyj wewnętrznego algorytmu klonowania strukturalnego . Jeśli węzły DOM zostaną przekazane, użyj XMLSerializer jak w niepowiązanym pytaniu .with (new XMLSerializer()) {serializeToString(document.documentElement) }
Jak wielu zauważyło,
arguments
zawiera wszystkie argumenty przekazane do funkcji.Jeśli chcesz wywołać inną funkcję z tymi samymi argumentami, użyj
apply
Przykład:
źródło
Podobna odpowiedź do Gunnara, z bardziej kompletnym przykładem: Możesz nawet w przejrzysty sposób zwrócić całość:
Wynik:
https://codepen.io/fnocke/pen/mmoxOr?editors=0010
źródło
Tak, jeśli nie masz pojęcia, ile argumentów jest możliwych w momencie deklaracji funkcji, możesz zadeklarować funkcję bez parametrów i uzyskać dostęp do wszystkich zmiennych za pomocą tablicy argumentów przekazywanych w momencie wywołania funkcji.
źródło
W ES6 możesz zrobić coś takiego:
źródło
W ES6 użyj
Array.from
:W przypadku kodu innego niż ES6 użyj JSON.stringify i JSON.parse:
Jeśli zamiast strityfikacji konieczne jest zachowanie, użyj wewnętrznego algorytmu klonowania strukturalnego .
Jeśli węzły DOM zostaną przekazane, użyj XMLSerializer jak w niepowiązanym pytaniu .
Jeśli działa jako bookmarklet, może być konieczne zawinięcie każdego argumentu danych strukturalnych w konstruktora błędów dla
JSON.stringify
aby działał poprawnie.Bibliografia
Struktura Klon Moduł CommonJS
JS Object Clone
MDN: Array.from ()
źródło