在函数定义中,"...args"(三个点)的含义是什么?

52

阅读这段 JavaScript 语法对我来说真的很困惑:

router.route('/:id')
.put((...args) => controller.update(...args))
.get((...args) => controller.findById(...args));

...args是什么意思?


4
"spread operator"被称为展开运算符。 - bejado
9
通常,...args 的意思是“任意数量的值”。例如,您可以传递null1,2,3,4 - 这并不重要,方法足够聪明以处理它。 - Tigger
2
这是ES6引入的新语法。请在此处查看文档 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/rest_parameters - Diode
剩余参数和展开语法 这是我发现的一个好教程。 - Rick
6个回答

63
关于(...args) =>...args是一个剩余参数。它必须始终是参数列表中的最后一项,并且将被分配一个包含未分配给先前参数的所有参数的数组。
基本上它是arguments对象的替代品。不需要再写:
function max() {
  var values = Array.prototype.slice.call(arguments, 0);
  // ...
}
max(1,2,3);

你可以写
function max(...value) {
  // ...
}
max(1,2,3);

此外,由于箭头函数没有 arguments 对象,这是创建可变参数(箭头)函数的唯一方法。
作为控制器的更新方法 controller.update(...args),请参见 "foo(...arg)"(函数调用中三个点的含义)是什么意思?

17

本质上,正在做的事情是这样的:

.put((a, b, c) => controller.update(a, b, c))

当然,如果我们需要4个参数、5个参数或6个参数怎么办?我们不想为所有可能的参数数量编写新版本的函数。 扩展运算符(...)允许我们接受可变数量的参数并将它们存储在数组中。然后我们再次使用扩展运算符将它们传递给update函数:
.put((...args) => controller.update(...args))

这对于接收它们作为普通参数的update函数是透明的。

6
... 不是一个操作符,它与扩展运算符没有任何关系。 - Felix Kling

2
“...args”(三个点)的意思是Javascript扩展运算符
function sum(x, y, z) {
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
// expected output: 6

很抱歉,您的代码即使正确,也不符合OP的问题。OP使用了剩余参数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters),而您使用了展开运算符。您可以在函数签名中看到...,具体来说是在定义函数参数时。而在调用函数时,您传递了...numbers,这是一个不同的时刻。 - undefined

1

意味着传递所有值(如果有未知数量的项目,则非常有用)

示例代码

console.log(sum(1, 2, 3, 4));  // expected output: 10

function sum(...allItems) { 
  let total = 0;
  for (const item of allItems) {
     total += item;
   }
   return total;
}

0

如果您了解一些 Python 语法,那么 *args 就完全相同。因为 *args(Python)是元组对象,而 Javascript 没有像 Python 那样的元组,所以 ..args 是一个数组对象。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

这被称为“rest参数”,您可以使用rest参数将未指定数量的参数作为数组传递,一个函数只能有一个rest参数,并且它必须是函数的最后一个参数。

    function sum(...args){
    let output = 0;
     for(const num of args){
     output += num;
     }
        return output;
     }

     console.log(sum(2,4,8));

这里接受作为数组传递的参数,并将输出求和并返回


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接