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

IT技术 javascript
2021-02-28 02:32:00

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

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

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

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

6个回答

ES3(或 ES5 或老派 JavaScript)

您可以通过魔术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

有更好的方法!新的休息参数功能支持您:

var print_names = function(...names) {
    for (let i=0; i<names.length; i++) console.log(names[i]);
}
ES6 对spread syntax这里的引用是非常不正确的。那是rest parameter你举例子。很好的答案,但令人困惑的是它被引用为spread
2021-04-25 02:32:00
感谢您的回答!我发现这是一篇有用的文章,解释了发生了什么Array.prototype.slice.call(arguments)medium.com/@andrewsburke/...
2021-04-29 02:32:00
感谢您提供如此详细且同时简短+简单的答案:)
2021-05-02 02:32:00
你会如何正确输入 ...names
2021-05-03 02:32:00

ES6/ES2015

利用其余参数语法

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

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

其余参数和参数对象之间有三个主要区别:

  • 其余参数只是那些没有被赋予单独名称的参数,而参数对象包含传递给函数的所有参数;
  • arguments 对象不是真正的数组,而其余参数是 Array 实例,这意味着可以直接对其应用 sort、map、forEach 或 pop 等方法;
  • arguments 对象具有特定于自身的附加功能(如被调用者属性)。
虽然(在 2016 年答案上升时更重要),请记住,如果您不进行转译,Internet Explorer 不支持点差我经常看到的关键问题:开发人员在模板中使用这样的东西,即使他们的 TypeScript(通常)也经常不会被转换。
2021-05-01 02:32:00
这对于通常使用常见 PHP 语法的 Web 开发非常有意义。
2021-05-09 02:32:00
var 
print_names = function() {
    console.log.apply( this, arguments );
};

print_names( 1, 2, 3, 4 );
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);
只要注意,这不是一个“真正”的阵列,它是一个“阵列状”对象(有一些特殊的特征),而是利用它“Array方法”,则需要将其转换,如var args = Array.prototype.slice.call(arguments);var args = Array.apply(null, arguments);等,有很多方法...
2021-04-27 02:32:00