Есть ли способ передать неизвестное количество аргументов, например:
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
Кроме того, как мне узнать количество переданных аргументов?
javascript
Эйси
источник
источник
.apply
). Остальные показывают, как читать неизвестное количество аргументов (из функции) (используяarguments
).Ответы:
ES3 (или ES5, или старый 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]); }
источник
spread syntax
здесь совершенно неверна. Этоrest parameter
вы привели пример. Хороший ответ, но сбивает с толку то, что на него ссылаются какspread
Array.prototype.slice.call(arguments)
: medium.com/@andrewsburke/...ES6 / ES2015
Воспользуйтесь синтаксисом остальных параметров .
function printNames(...names) { console.log(`number of arguments: ${names.length}`); for (var name of names) { console.log(name); } } printNames('foo', 'bar', 'baz');
Между параметрами rest и объектом arguments есть три основных различия:
источник
var print_names = function() { console.log.apply( this, arguments ); }; print_names( 1, 2, 3, 4 );
источник
function print_args() { for(var i=0; i<arguments.length; i++) console.log(arguments[i]) }
источник
Каждой вызываемой функции в JavaScript передается скрытый объект
arguments
.Вы просто используете,
arguments.length
чтобы получить количество аргументов, переданных функции.Чтобы перебрать аргументы, вы должны использовать цикл:
for(var i = arguments.length; i--) { var arg = arguments[i]; }
Обратите внимание, что
arguments
это не настоящий массив, поэтому, если он вам нужен как массив, вы должны преобразовать его следующим образом:var args = Array.prototype.slice.call(arguments);
источник
var args = Array.prototype.slice.call(arguments);
,var args = Array.apply(null, arguments);
и т. Д. , есть много способов ...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)
источник
for
блока не нужна, но я бы добавил ее в конец последней строки.FunctionExpression
vsFunctionDeclaration
, посмотрите эту статью .Теперь намного лучше для ES6
function Example() { return { arguments: (...args) =>{ args.map(a => console.log()); } } } var exmpl = new Example(); exmpl.arguments(1, 2, 3, 'a', 'b', 'c');
надеюсь, это поможет
источник
Остальные параметры в 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); } }
источник
Вы можете использовать оператор spread / rest для сбора ваших параметров в массив, и тогда
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; }
источник
Вы можете создать функцию, используя оператор распространения / отдыха, и с этого момента вы достигли своей цели. Взгляните на фрагмент ниже.
const print_names = (...args) => args.forEach(x => console.log(x));
источник
let x = function(){ return [].slice.call(arguments); }; console.log(x('a','b','c','d'));
источник
Мне нравится это делать:
Это не поможет, если вы не знаете количество аргументов, но поможет, если вы не хотите запоминать их порядок.
/** * @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'); } }
источник