Javascript:";“无限”;函数的参数?

Javascript:";“无限”;函数的参数?,javascript,function,parameters,infinite,Javascript,Function,Parameters,Infinite,在Chrome中,当我在下面的一个中键入console.log时: console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); …它正确打印,

在Chrome中,当我在下面的一个中键入
console.log
时:

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");
…它正确打印,没有错误或警告。我附加了更多参数,但它仍然正确地打印出来

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");

我怎么能有一个像那样的“无限”参数函数呢?

函数可以访问一个名为
arguments
的类似数组的对象,该对象包含它们接收到的所有参数

function print_my_arguments(/**/){
    var args = arguments;
    for(var i=0; i<args.length; i++){
        console.log(args[i]);
    }
};
需要注意的一些要点:

  • arguments
    不是实际的数组,它没有常用的数组方法(slice、join等)。可以使用以下行将其转换为数组:

    var args = Array.prototype.slice.call(arguments);
    
  • 如果希望数组仅包含接收到的非命名参数,则切片也很有用:

    function foo(first_arg, second_arg /**/){
        var variadic_args = Array.prototype.slice.call(arguments, 2);
    }
    
  • 不是每个浏览器都能处理任意数量的函数参数。上次我测试这个时,在Chrome和IE中,在大约20万个参数后出现了堆栈溢出。如果您的函数可以接收任意数量的参数,请考虑将所有这些参数打包在常规数组中,而

  • 在我的示例的参数列表中出现的那些
    /**/
    注释不是强制性的。它们只是一个编码约定,我用它来标记变量函数,并将它们与常规函数区分开来

    // A quick glance would suggest that this function receives no
    // parameters but actually it is a variadic function that gets
    // its parameters via the `arguments` object.
    function foo(){
        console.log(arguments.length);
    }
    

  • 您可以使用arguments数组:

    函数foo(){
    for(var i=0;i
    现代的方法是使用:

    函数printArguments(…args){
    参数forEach((参数,索引)=>{
    log(`Argument${index}:`,arg);
    });
    }
    printArguments('hello',true,new Date());
    
    通过使用
    …args
    语法,所有参数都保存在名为
    args
    的数组中

    除Internet Explorer外,所有浏览器都已在其最新版本中提供此功能


    Fiddle:

    回答得很好,+1对于警告,我没有阅读它们,而是运行了第一个。对于今年或以后来到这里的任何人,请注意,rest参数现在是执行此操作的首选方法。请看下面Felix Edelmann的答案。这是前面答案的重复。将来,如果您可以提供替代答案或为现有答案增加价值,则会有所帮助
    // A quick glance would suggest that this function receives no
    // parameters but actually it is a variadic function that gets
    // its parameters via the `arguments` object.
    function foo(){
        console.log(arguments.length);
    }
    
    function foo() {
        for (var i = 0; i < arguments.length; i++) {
            document.body.innerHTML += arguments[i];
        }
    }
    
    
    foo("There ", "are ", "as ", "much ", "arguments ", "as ", "you ", "want.");