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

ajs*_*sie 72 javascript

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

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

print_names('foo', 'bar', 'baz');
Run Code Online (Sandbox Code Playgroud)

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

ShZ*_*ShZ 129

ES3(或ES5或oldschool Javascript)

您可以通过魔术arguments对象访问传递给任何javascript函数的参数,该对象的行为与数组类似.使用arguments你的功能看起来像

var print_names = function() {
     for (var i=0; i<arguments.length; i++) console.log(arguments[i]);
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是很重要的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);
Run Code Online (Sandbox Code Playgroud)

ES6 /打字稿

还有更好的方法!新的休息参数功能有你的背:

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

  • 感谢您提供如此详细且同时简短+简单的答案:) (3认同)
  • Oof,好赶上@Ryan,我已经更新了链接. (2认同)

Rat*_*ica 16

ES6/ES2015

利用rest参数语法.

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

printNames('foo', 'bar', 'baz');
Run Code Online (Sandbox Code Playgroud)

rest参数和arguments对象之间有三个主要区别:

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


pub*_*ide 11

var 
print_names = function() {
    console.log.apply( this, arguments );
};

print_names( 1, 2, 3, 4 );
Run Code Online (Sandbox Code Playgroud)


Gab*_*aru 6

function print_args() {
    for(var i=0; i<arguments.length; i++)
        console.log(arguments[i])
}
Run Code Online (Sandbox Code Playgroud)


Jac*_*kin 6

有一个隐藏的对象传递给JavaScript中的每个函数调用arguments.

您只需使用arguments.length获取传递给函数的参数量.

要遍历参数,您将使用循环:

for(var i = arguments.length; i--) {
   var arg = arguments[i];
}
Run Code Online (Sandbox Code Playgroud)

请注意,这arguments不是一个真正的数组,所以如果你需要它作为一个数组,你会像这样转换它:

var args = Array.prototype.slice.call(arguments);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它不是一个"真正的"数组,它是一个"类似数组"的对象(具有一些特殊的特性),但要使用"数组方法",你需要转换它,例如`var args = Array.prototype.slice.call(arguments);`,`var args = Array.apply(null,arguments);`等,有很多方法...... (3认同)