Potrzebuję metody, która może mieć dowolną liczbę parametrów. W C # mamy oświadczenie params. Czy mamy coś podobnego w JavaScript?

18
Kees C. Bakker 29 listopad 2011, 15:35

6 odpowiedzi

Najlepsza odpowiedź

Jest kolekcja arguments, która zawiera wszystkie argumenty przekazywane do funkcji.

Jest A) nie ma potrzeby określania "opcjonalnych" argumentów w podpisie funkcji i b) dowolna funkcja akceptuje dowolną liczbę parametrów.

function foo() {
  console.log(arguments);
}

foo(1,2,3,4);  // logs [1, 2, 3, 4]

Podobnie, nie ma potrzeby dostarczania "wymaganych" argumentów w połączeniu funkcyjnym:

function foo(a, b, c, d) {
  console.log(arguments);
}

foo(1,2);  // logs [1, 2]

Każdy argument o nazwie podpisu, ale nie dostarczany w połączeniu funkcji będzie undefined.

Należy pamiętać, że arguments zachowuje się jak tablica, ale technicznie to nie jest. Na przykład możesz zadzwonić arguments[0], ale nie możesz zadzwonić arguments.slice(). Co możesz zrobić, aby przejść dookoła, używa prototypu tablicy:

Array.prototype.slice.call(arguments, 1, 2);

Tak zwany parametr reszty {{ X0}} To nowy (ES6 +) dodatek do języka i sprawia, że działa z funkcjami Variady. @ ARCUNCM Odpowiedź wyjaśnia go.

32
Tomalak 5 grudzień 2018, 11:18

Tak. arguments.

function concatStrings () {
    var str = '';
    for (var i = 0; i < arguments.length; i++) {
        str += arguments[i];
    }
    return str;
}

Bądź świadomy, że arguments nie jest tablicą, więc nie ma metod, takich jak join lub push. To tylko obiekt podobny do tablicy (z właściwościami numerycznymi i właściwością length), dzięki czemu można go iterować.

3
Nathan MacInnes 29 listopad 2011, 11:40

JavaScript ma arguments obiekt wewnątrz funkcji. Zawiera wszystkie params przekazywane do funkcji.

Więcej informacji

2
antyrat 29 listopad 2011, 11:39

Jest to jakiś niejawny w specjalnej zmiennej "argumenty". Użyj takich:

function something(arg1, arg2) {
    for (var i = 0; i < arguments.length; i++) {
        var x = arguments[i];
    }
}

Wtedy możesz nazwać to jak something(1, 2, 3, 'a', 'b', 'c')

Więcej przykładów tutaj: http://www.jtricks.com/javascript_tutoriale/varargs.html

1
Rafael Steil 29 listopad 2011, 11:40

Funkcje JavaScript mogą domyślnie zaakceptować dowolną liczbę parametrów. Możesz je zobaczyć za pomocą zmiennej arguments.

Zobacz Oto.

0
Kraylog 29 listopad 2011, 14:46

Wiem, że ten wątek jest za stary, ale wierzę, że coś tutaj brakuje.

Jest parametr reszty (EM> wprowadzony w ECMAScript 6 ), który pozwoli nam reprezentować nieokreślony liczbę argumentów jako tablicy .
.

Zawsze zwraca tablicę . Co oznacza, że nawet w krainie defensywnej JavaScript, jest OK, aby robić takie rzeczy jak sprawdzić .length odpoczynku bez strażników.

składnia:

function(a, b, ...theArgs) {
// ...
}

Istnieją trzy główne różnice między parametrami odpoczynkowymi a obiektami argumentów:

  1. Parametry odpoczynku są tylko tymi, które nie otrzymały oddzielnej nazwy, podczas gdy obiekt argumentów zawiera wszystkie argumenty przekazywane do funkcji
  2. Obiekt argumentów nie jest prawdziwą tablicą, podczas gdy parametry odpoczynku są instancjami tablic, oznaczających metody, takie jak sortowanie, mapę, foreach lub pop, mogą być stosowane bezpośrednio na nim;
  3. Obiekt argumentów ma dodatkową funkcjonalność specyficzną dla siebie (jak właściwość Callee).

Dodatkowe czytanie: Spread

function f(x, ...y) {
  // y is an Array
  return x * y.length;
}

console.log("Expected result : 3*2 = 6 & Actual result : " + f(3, "hello", true));
console.log("Expected result : 3*4 = 12 & Actual result : " + f(3, "a", true, "b", 1));

//here we are not passing anything to "y" but its still safe to check .length of "y" because it always return an array.
console.log("Expected result : 3*0 = 0 & Actual result : " + f(3));
14
Arun CM 19 kwiecień 2017, 11:34