2011-06-18 35 views
31

Czy funkcja JavaScript może przyjmować nieograniczoną liczbę argumentów? coś takiego:Nieograniczone argumenty w funkcji JavaScript

testArray(1, 2, 3, 4, 5...); 

Staram:

var arr = []; 
function testArray(A) { 
    arr.push(A); 
} 

Ale to nie zadziała (wyjście jest tylko pierwszy argument). Lub jedynym sposobem jest:

function testArray(a, b, c, d, e...) { 

} 

Dzięki

+0

Jako alternatywę, można mieć jeden parametr - kontener "nieograniczony", taki jak tablica (lub obiekt), a następnie przekazać wszystko jako tablicę, nawet jeśli istnieje tylko "... ([one_arg])" ... –

+0

Należy pamiętać, że aby bezpośrednio odpowiedzieć na pytanie, [Nie, nie możesz.] (Http: // stackoverflow.com/questions/22747068/is-there-a-max-number-of-arguments-javascript-functions-can-accept) – Kaiido

Odpowiedz

49

Jest to dziwne „magia” zmiennej można odwoływać zwane „argumenty”:

function manyArgs() { 
    for (var i = 0; i < arguments.length; ++i) 
    alert(arguments[i]); 
} 

To jak tablicą, ale to nie jest tablica. W rzeczywistości jest tak dziwnie, że naprawdę nie powinno się go używać w ogóle. Powszechną praktyką jest, aby wartości niego w prawdziwy tablicy:

function foo() { 
    var args = Array.prototype.slice.call(arguments, 0); 
    // ... 

W tym przykładzie, „args” byłaby zwykła tablica, bez żadnej z tajemniczości. Istnieje wiele nieprzyjemnych problemów z "argumentami", a w ECMAScript 5 jego funkcjonalność zostanie ograniczona.

edit — chociaż przy użyciu funkcji .slice() pewno jest wygodne, okazuje się, że przekazanie obiektu arguments z funkcji powoduje bóle głowy dla optymalizacji, tak bardzo, że funkcje, które robią to nie może dostać zoptymalizowany w ogóle. Prosty, bezpośredni sposób, aby włączyć arguments do tablicy jest zatem

function foo() { 
    var args = []; 
    for (var i = 0; i < arguments.length; ++i) args[i] = arguments[i]; 
    // ... 
} 

More about arguments and optimization.

+0

Dziękuję wszystkim za odpowiedź! – rhavd

+3

Nie ma w tym nic "magicznego" lub dziwnego, obiekt argumentów jest zdefiniowany w ECMA-262. Jedynym podobieństwem do tablicy jest to, że jej własność length jest o wiele większa niż najwyższa nazwa właściwości numerycznej. Poza tym to tylko obiekt z właściwościami. – RobG

+5

Byłem poetycki :-) A zmienna "arguments" * jest * dziwna - ma również takie cechy jak własność "callee". – Pointy

1
function toArray() { 
    return arguments; 
} 

var myargs = toArray(1, 2, 3, 4, 5, 6); 

arguments kluczowe jest dostępny w każdym js funkcji

+0

'argumenty' nie jest typu" Tablica " ', to po prostu rodzaj" iterable ", a to jest dość kiepskie ze strony JS. –

1
var arr = []; 
function testArray() { 
    Array.prototype.push.apply(arr, arguments); 
} 
10

Od ECMAScript 2015 (lub ES6) mamy również dostęp do rest parameters, które dają nam nieco czystszy sposób zarządzania argumentami:

function foo(a, b, ...others) { 
    console.log("a and b are ", a, b); 

    for (let val of others) { 
     console.log(val); 
    } 
} 

foo(1, 2, 3, 4, 5); 

W chwili pisania tego tekstu jest to obsługiwane przez Chrome 47+, Firefox 15+ i Edge. Ta funkcja jest również dostępna za pośrednictwem transpozycji Babel i TypeScript do wersji ES5.

+1

Dziękuję, właśnie tego szukałem. Zwłaszcza link MDN, po prostu nie mogłem zapamiętać jego nazwy. :) – Noitidart

1

Z ECMAScript 6, można użyć resztę składni argumenty

const testArray = (...args) => { 
    console.log(args); 
}; 

testArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
0

Można też po prostu "cast" go, oszczędzając brzydkie pętlę:

var getArguments = function() { 
    return arguments; 
}; 

var foo = getArguments(1,2,3,4); 

// console.log(foo.slice()); => TypeError: foo.slice is not a function 

var foo = Object.values(foo); 

console.log(foo); // => [ 1, 2, 3, 4 ] 

foo.push(5); 

console.log(foo); // => [ 1, 2, 3, 4, 5 ]