将未知数量的参数传递给javascript函数

时间:2010-11-07 05:25:40

标签: javascript

有没有办法传递未知数量的参数,如:

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

print_names('foo', 'bar', 'baz');

另外,如何获取传入的参数数量?

12 个答案:

答案 0 :(得分:120)

ES3(或ES5或oldschool Javascript)

您可以通过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);

ES6 / Typescript

有更好的方法!新的rest parameters功能有你的后背:

var print_names = function(...names) {
    for (let i=0; i<names.length; i++) console.log(names[i]);
}

答案 1 :(得分:13)

ES6 / ES2015

利用rest parameter syntax

function printNames(...names) {
  console.log(`number of arguments: ${names.length}`);
  for (var name of names) {
    console.log(name);
  }
}

printNames('foo', 'bar', 'baz');

其他参数与之间存在三个主要差异 arguments对象:

  • rest参数只是那些没有给出单独名称的参数,而arguments对象包含all 传递给函数的参数;
  • arguments对象不是真正的数组,而rest参数是Array实例,这意味着可以直接在其上应用sort,map,forEach或pop等方法;
  • arguments对象具有特定于其自身的附加功能(如callee属性)。

答案 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');
    }
}