Передать неизвестное количество аргументов в функцию JavaScript - PullRequest
66 голосов
/ 07 ноября 2010

Есть ли способ передать неизвестное количество аргументов, например:

var print_names = function(names) {
    foreach(name in names) console.log(name); // something like this
}

print_names('foo', 'bar', 'baz');

Кроме того, как мне узнать количество переданных аргументов?

Ответы [ 9 ]

122 голосов
/ 07 ноября 2010

ES3 (или ES5 или oldschool Javascript)

Вы можете получить доступ к аргументам, передаваемым любой функции javascript, через магический объект arguments, который ведет себя аналогично массиву.При использовании arguments ваша функция будет выглядеть как

var print_names = function() {
     for (var i=0; i<arguments.length; i++) console.log(arguments[i]);
}

Важно отметить, что arguments - это , а не массив.На MDC есть хорошая документация: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object

Если вы хотите превратить arguments в массив, чтобы вы могли делать такие вещи, как .slice(), .push() и т. Д., Используйте что-то вроде этого:

var args = Array.prototype.slice.call(arguments);

ES6 / Typescript

Есть лучший способ!Новая функция остальных параметров поддерживает вас:

var print_names = function(...names) {
    for (let i=0; i<names.length; i++) console.log(names[i]);
}
13 голосов
/ 03 февраля 2016

ES6 / ES2015

Воспользуйтесь преимуществом синтаксиса параметра rest .

function printNames(...names) {
  console.log(`number of arguments: ${names.length}`);
  for (var name of names) {
    console.log(name);
  }
}

printNames('foo', 'bar', 'baz');

Существует три основных различия между параметрами покоя и аргументы объекта:

  • остальные параметры - это только те, которым не было дано отдельное имя, в то время как объект arguments содержит все аргументы переданы функции;
  • объект arguments не является реальным массивом, в то время как остальные параметры являются экземплярами Array, то есть методы, такие как sort, map, forEach или pop, могут применяться к нему напрямую;
  • Объект arguments имеет дополнительную функциональность, специфичную для себя (например, свойство callee).
8 голосов
/ 13 августа 2013
var 
print_names = function() {
    console.log.apply( this, arguments );
};

print_names( 1, 2, 3, 4 );
6 голосов
/ 07 ноября 2010

В каждую функцию JavaScript передается скрытый объект с именем arguments.

Вы бы просто использовали arguments.length, чтобы получить количество аргументов, переданных функции.

Чтобы перебрать аргументы, вы должны использовать цикл:

for(var i = arguments.length; i--) {
   var arg = arguments[i];
}

Обратите внимание, что arguments не является реальным массивом, поэтому, если вам нужен его как массив, вы можете преобразовать его следующим образом:

var args = Array.prototype.slice.call(arguments);
6 голосов
/ 07 ноября 2010
function print_args() {
    for(var i=0; i<arguments.length; i++)
        console.log(arguments[i])
}
4 голосов
/ 07 ноября 2010

arguments.length. Вы можете использовать для него цикл.

(function () {
    for (var a = [], i = arguments.length; i--;) {
        a.push(arguments[i]);
    };
    return a;
})(1, 2, 3, 4, 5, 6, 7, 8)
2 голосов
/ 20 февраля 2017

Гораздо лучше сейчас для ES6

function Example() {
    return {
        arguments: (...args) =>{
            args.map(a => console.log());
        }
    }
}

var exmpl = new Example();
exmpl.arguments(1, 2, 3, 'a', 'b', 'c');

Надеюсь, это поможет

0 голосов
/ 07 июня 2019

Параметры покоя в ES6

const example = (...args) => {
  for (arg in args) {
    console.log(arg);
  }
}

Примечание: обычные параметры можно передавать до параметров остальных

const example = (arg1, ...args) => {
  console.log(arg1);
  for (arg in args) {
    console.log(arg);
  }
}
0 голосов
/ 07 ноября 2010

Мне нравится это делать:

Это не поможет, если вы не знаете количество аргументов, но поможет, если вы не хотите помнить их порядок.

/**
 *  @param  params.one        A test parameter
 *  @param  params.two        Another one  
 **/
function test(params) {

    var one = params.one;
    if(typeof(one) == 'undefined') {
        throw new Error('params.one is undefined');
    }

    var two = params.two;
    if(typeof(two) == 'undefined') {
        throw new Error('params.two is undefined');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...