将未知数量的parameter passing给javascript函数

有没有办法传递一个未知数量的参数:

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

另外,我如何获得通过参数的数量?

ES3(或ES5或老式的Javascript)

您可以通过magic arguments对象访问传递给任何javascript函数的arguments ,这些arguments行为与数组类似。 使用arguments你的function看起来像

 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]); } 

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对象有三个主要区别:

  • rest参数只是没有被赋予单独名称的参数,而arguments参数则包含传递给函数的所有参数;
  • 参数对象不是真正的数组,而其余参数是数组实例,这意味着可以直接对sort,map,forEach或pop等方法应用;
  • 参数对象具有特定于自身的附加function(如callee属性)。
 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 print_names = function() { console.log.apply( this, arguments ); }; print_names( 1, 2, 3, 4 ); 

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) 

ES6现在好多了

 function Example() { return { arguments: (...args) =>{ args.map(a => console.log()); } } } var exmpl = new Example(); exmpl.arguments(1, 2, 3, 'a', 'b', 'c'); 

我希望这有帮助

我喜欢这样做:

如果您不知道参数的数量,这将无济于事,但如果您不想记住它们的顺序,则会有所帮助。

 /** * @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'); } }