Подтвердить что ты не робот

Неограниченные аргументы в функции JavaScript

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

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

Я пытаюсь:

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

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

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

}

Спасибо

4b9b3361

Ответ 1

Там есть странная "волшебная" переменная, которую вы можете ссылаться на "аргументы":

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

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

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 и оптимизации.

Ответ 2

Как и в 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.

Ответ 3

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

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

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

Ответ 4

function toArray() {
   return arguments;
}

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

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

Ответ 5

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

Ответ 6

Вы также можете просто "бросить" его, сохранив уродливый цикл:

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 ]

Ответ 7

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

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

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

Ответ 8

Javascript ES5

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

Javascript ES6

const testArray = (...arg) => console.log(arg)