将未知数量的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'); } }