有没有办法传递未知数量的参数,如:
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
另外,如何获取传入的参数数量?
答案 0 :(得分:120)
您可以通过magic arguments
对象访问传递给任何javascript函数的参数,该对象的行为与数组类似。使用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);
有更好的方法!新的rest parameters功能有你的后背:
var print_names = function(...names) {
for (let i=0; i<names.length; i++) console.log(names[i]);
}
答案 1 :(得分:13)
function printNames(...names) {
console.log(`number of arguments: ${names.length}`);
for (var name of names) {
console.log(name);
}
}
printNames('foo', 'bar', 'baz');
其他参数与之间存在三个主要差异 arguments对象:
答案 2 :(得分:8)
var
print_names = function() {
console.log.apply( this, arguments );
};
print_names( 1, 2, 3, 4 );
答案 3 :(得分:6)
function print_args() {
for(var i=0; i<arguments.length; i++)
console.log(arguments[i])
}
答案 4 :(得分:5)
有一个隐藏的对象传递给JavaScript中的每个函数arguments
。
您只需使用arguments.length
来获取传递给函数的参数数量。
要遍历参数,您将使用循环:
for(var i = arguments.length; i--) {
var arg = arguments[i];
}
请注意arguments
不是真正的数组,所以如果你需要它作为一个数组,你可以像这样转换它:
var args = Array.prototype.slice.call(arguments);
答案 5 :(得分:3)
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)
答案 6 :(得分:2)
现在为ES6好多了
function Example() {
return {
arguments: (...args) =>{
args.map(a => console.log());
}
}
}
var exmpl = new Example();
exmpl.arguments(1, 2, 3, 'a', 'b', 'c');
我希望这会有所帮助
答案 7 :(得分:0)
ES6中的其余参数
dsn = (
"DRIVER={{IBM DB2 ODBC DRIVER}};"
"DATABASE={0};"
"HOSTNAME={1};"
"PORT={2};"
"PROTOCOL=TCPIP;"
"UID={3};"
"PWD={4};"
"Security={5};"
"SSLClientKeystoredb={6};"
"SSLClientKeystoreDBPassword={7};").format(dsn_database, dsn_hostname, dsn_port, dsn_uid, dsn_pwd, dsn_security, dsn_keystore, dsn_keypwd)
注意:您可以在其余参数之前传递常规参数
const example = (...args) => {
for (arg in args) {
console.log(arg);
}
}
答案 8 :(得分:0)
您可以使用价差/余数运算符创建一个函数,然后就可以实现目标。请看下面的块。
const print_names = (...args) => args.forEach(x => console.log(x));
答案 9 :(得分:0)
您可以使用传播/剩余运算符将参数收集到数组中,然后数组的length
将是您传递的参数数量:
function foo(...names) {
console.log(names);
return names;
}
console.log(foo(1, 2, 3, 4).length);
使用keyword arguments将函数转换为老式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;
}
答案 10 :(得分:0)
let x = function(){
return [].slice.call(arguments);
};
console.log(x('a','b','c','d'));
答案 11 :(得分:-4)
我喜欢这样做:
如果您不知道参数的数量,这将无济于事,但如果您不想记住它们的顺序,它会有所帮助。
/**
* @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');
}
}