Действительно ли возможно отправить переменное количество аргументов функции JavaScript?

Действительно ли возможно отправить переменное количество аргументов функции JavaScript от массива?

var arr = ['a','b','c']

var func = function()
{
    // debug 
    alert(arguments.length);
    //
    for(arg in arguments)
        alert(arg);
}

func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'

Я недавно записал много Python, и это - замечательный шаблон, чтобы смочь принять varargs и отправить их. например.

def func(*args):
   print len(args)
   for i in args:
       print i

func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(*arr) // prints 4 which is what I want, then 'a','b','c','d'

Действительно ли возможно в JavaScript отправить массив, который будут рассматривать как массив arguments?

159
задан Reinstate Monica 19 June 2012 в 22:37
поделиться

4 ответа

Update: Начиная с ES6, вы можете просто использовать синтаксис spread при вызове функции:

func(...arr);

Так как ES6, также если вы ожидаете, что ваши аргументы будут рассматриваться как массив, вы можете использовать синтаксис spread в списке параметров, например:

function func(...args) {
  args.forEach(arg => console.log(arg))
}

const values = ['a', 'b', 'c']
func(...values)
func(1, 2, 3)

И вы можете комбинировать его с обычными параметрами, например, если вы хотите получать первые два аргумента по отдельности, а остальные - как массив:

function func(first, second, ...theRest) {
  //...
}

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

var test = function (one, two, three) {}; 
test.length == 3;

Но в любом случае, вы можете передать произвольное количество аргументов. ...

Синтаксис спреда короче и "слаще", чем apply, и если вам не нужно устанавливать значение this при вызове функции, то так будет лучше.

Вот пример apply, который был первым способом:

var arr = ['a','b','c'];

function func() {
  console.log(this); // 'test'
  console.log(arguments.length); // 3

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

};

func.apply('test', arr);

В настоящее время я рекомендую использовать apply только в том случае, если необходимо передать произвольное количество аргументов из массива и установить значение this. В качестве первых аргументов, которые будут использоваться при вызове функции, если в нестроковом коде использовать null, то apply take - это значение this, ключевое слово this будет относиться к Глобальному объекту (окну) внутри func, в строгом режиме, когда явно используется 'use strict' или в модулях ES, будет использоваться null. Также обратите внимание, что объект arguments на самом деле не является массивом, вы можете преобразовать его с помощью:

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

And в ES6:

const argsArray = [...arguments] // or Array.from(arguments)

But you rarely use the arguments object directly now now благодаря синтаксису spread.

.
182
ответ дан 23 November 2019 в 21:36
поделиться

В любой функции javascript можно передать столько значений, сколько захотите. Явно именованные параметры получат первые несколько значений, но ВСЕ параметры будут храниться в массиве аргументов.

Для передачи массива аргументов в "распакованном" виде можно использовать apply, например (c.f. Functional Javascript):

var otherFunc = function() {
   alert(arguments.length); // Outputs: 10
}

var myFunc = function() {
  alert(arguments.length); // Outputs: 10
  otherFunc.apply(this, arguments);
}
myFunc(1,2,3,4,5,6,7,8,9,10);
73
ответ дан 23 November 2019 в 21:36
поделиться

Называется оператор splat. Вы можете сделать это в JavaScript, используя apply:

var arr = ['a','b','c','d'];
var func = function() {
    // debug 
    console.log(arguments.length);
    console.log(arguments);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
func.apply(null, arr); 
5
ответ дан 23 November 2019 в 21:36
поделиться

Функция apply принимает два аргумента; объект this привязывается к, а аргументы представляются в виде массива.

some_func = function (a, b) { return b }
some_func.apply(obj, ["arguments", "are", "here"])
// "are"
7
ответ дан 23 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: