Передайте неизвестное количество аргументов в функцию javascript
Есть ли способ передать неизвестное количество аргументов, например:
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
Также, как мне получить количество аргументов, переданных в?
Ответы
Ответ 1
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/Машинопись
Там лучший способ! Новая функция параметров отдыха имеет вашу спину:
var print_names = function(...names) {
for (let i=0; i<names.length; i++) console.log(names[i]);
}
Ответ 2
ES6/ES2015
Воспользуйтесь синтаксисом остальных параметров.
function printNames(...names) {
console.log('number of arguments: ${names.length}');
for (var name of names) {
console.log(name);
}
}
printNames('foo', 'bar', 'baz');
Существует три основных различия между параметрами покоя и объектом аргументов:
- остальные параметры - это только те, которым не было дано отдельное имя, в то время как объект arguments содержит все аргументы, переданные функции;
- объект arguments не является реальным массивом, в то время как параметры rest являются экземплярами Array, то есть методы, такие как sort, map, forEach или pop, могут применяться к нему напрямую;
- Объект arguments имеет дополнительную функциональность, специфичную для себя (например, свойство callee).
Ответ 3
var
print_names = function() {
console.log.apply( this, arguments );
};
print_names( 1, 2, 3, 4 );
Ответ 4
function print_args() {
for(var i=0; i<arguments.length; i++)
console.log(arguments[i])
}
Ответ 5
Есть скрытый объект, переданный каждой функции в JavaScript под названием arguments
.
Вы просто используете arguments.length
, чтобы получить количество аргументов, переданных функции.
Чтобы перебрать аргументы, вы должны использовать цикл:
for(var i = arguments.length; i--) {
var arg = arguments[i];
}
Обратите внимание, что arguments
не является реальным массивом, поэтому, если бы вам понадобилось его как массив, вы бы преобразовали его следующим образом:
var args = Array.prototype.slice.call(arguments);
Ответ 6
arguments.length
. вы можете использовать для него цикл for.
(function () {
for (var a = [], i = arguments.length; i--;) {
a.push(arguments[i]);
};
return a;
})(1, 2, 3, 4, 5, 6, 7, 8)
Ответ 7
Намного лучше теперь для ES6
function Example() {
return {
arguments: (...args) =>{
args.map(a => console.log());
}
}
}
var exmpl = new Example();
exmpl.arguments(1, 2, 3, 'a', 'b', 'c');
Я надеюсь, что это поможет
Ответ 8
Параметры покоя в 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);
}
}
Ответ 9
Вы можете создать функцию, используя оператор распространения/отдыха, и с этого момента вы достигли своей цели. Пожалуйста, посмотрите на кусок ниже.
const print_names = (...args) => args.forEach(x => console.log(x));
Ответ 10
Вы можете использовать оператор распространения/отдыха, чтобы собрать ваши параметры в массив, и тогда length
массива будет числом переданных вами параметров:
function foo(...names) {
console.log(names);
return names;
}
console.log(foo(1, 2, 3, 4).length);
Используя BabelJS, я преобразовал функцию в oldschool JS:
"use strict";
function foo() {
for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
names[_key] = arguments[_key];
}
console.log(names);
return names;
}
Ответ 11
Мне нравится делать это:
Это не поможет, если вы не знаете количество аргументов, но это помогает, если вы не хотите запоминать их порядок.
/**
* @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');
}
}