Неограниченные аргументы в функции JavaScript - PullRequest
37 голосов
/ 18 июня 2011

Может ли функция JavaScript принимать неограниченные аргументы?Примерно так:

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

Я пытаюсь:

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

Но это не работает (вывод - только первый аргумент).Или единственный способ:

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

}

Спасибо

Ответы [ 7 ]

55 голосов
/ 18 июня 2011

Существует странная «волшебная» переменная, на которую вы можете ссылаться, называемая «аргументами»:

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

Это подобно массиву, но это не массив.На самом деле это так странно, что вам вообще не стоит его использовать.Обычной практикой является получение значений в массиве real :

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

В этом примере «args» будет обычным массивом без каких-либо странностей.Существуют всевозможные неприятные проблемы с «аргументами», и в ECMAScript 5 его функциональность будет ограничена.

edit - хотя использование функции .slice(), безусловно, удобно, оказывается,то, что передача объекта arguments из функции вызывает головную боль для оптимизации, настолько, что функции, которые делают это, могут вообще не оптимизироваться.Поэтому простой и простой способ превратить arguments в массив - это

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

Подробнее о arguments и оптимизации.

19 голосов
/ 21 октября 2015

Начиная с ECMAScript 2015 (или ES6) у нас также есть доступ к параметрам покоя , которые дают нам немного более чистый способ управления аргументами:

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);

На момент написания этой статьиэто поддерживается Chrome 47+, Firefox 15+ и Edge.Эта функция также доступна через Babel и TypeScript , вплоть до ES5.

5 голосов
/ 17 мая 2017

С ECMAScript 6 вы можете использовать синтаксис остальных аргументов:

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

testArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
1 голос
/ 15 октября 2018

Существуют некоторые устаревшие методы, но я предпочитаю ES6 и более новые версии, поэтому, если я захочу реализовать это, я напишу это следующим образом:

const func = ...arg => console.log(arg);

Простая и передовая технология.

1 голос
/ 29 ноября 2017

Вы также можете просто «разыграть» его, избавив вас от уродливой петли:

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 ]
1 голос
/ 18 июня 2011
var arr = [];
function testArray() {
    Array.prototype.push.apply(arr, arguments);
}
1 голос
/ 18 июня 2011
function toArray() {
   return arguments;
}

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

Ключевое слово arguments доступно в каждой функции js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...