Javascript 简明教程

JavaScript - Rest Parameter

Rest Parameter

JavaScript 中的 rest parameter 使函数可以接受一个可变数量的参数作为数组。当需要传递给函数的参数数量不固定时,可以使用剩余参数。

JavaScript 剩余参数允许你在单个数组中收集所有剩余的参数。剩余参数用三个点(…​)加上一个参数名表示。此参数名是包含所有剩余参数的数组。

Rest Parameter Syntax

JavaScript 中的剩余参数涉及在函数声明中使用三个点(…​)加上一个参数名。

function functionName(para1, para2, ...theArgs){
   // function body;
}

其中,para1 和 para2 是普通参数,而 theArgs 是剩余参数。剩余参数会收集剩余的参数(此处为不对应于参数(para1 和 para1)的其他参数),并将其分配给名为 theArgs 的数组。

我们还可以像函数声明中一样在函数表达式中编写剩余参数。

rest parameter 应该始终是函数定义中的最后一个参数。

function funcName(...para1, para2, para2){}
// SyntaxError: Invalid or unexpected token

函数定义只能有一个剩余参数。

function funcName(para1, ...para2, ...para3){}
//SyntaxError: Rest parameter must be last formal parameter

Example: Variable Length Parameter List

当你想要定义一个可以处理可变数量的参数的函数时,剩余参数非常有用。让我们看以下示例:

<html>
<body>
  <div> Rest parameter allows function to accept nay number of arguments.</div>
  <div id = "demo"> </div>
  <script>
    function sum(...nums) {
      let totalSum = 0;
      for (let num of nums) {
        totalSum += num;
      }
      return totalSum;
    }
    document.getElementById("demo").innerHTML =
	 sum(10, 20, 30, 40) + "<br>" +
    sum(10, 20) + "<br>" +
    sum();
  </script>
</body>
</html>
Rest parameter allows function to accept nay number of arguments.
100
30
0

在此处,剩余参数 nums 允许函数接受任意数量的数字参数。

Example: Finding the Maximum Number

JavaScript 剩余参数简化了在给定数字集中查找最大数字的过程。

在这个示例中,我们使用 rest 参数 numbers 来收集传递给函数的所有参数。展开运算符用来将各个值传给 Math.max() 函数。

<html>
<body>
   <div> Finding the maximum number</div>
   <div id = "demo"> </div>
   <script>
      function getMax(...args){
         return Math.max(...args);
      }
      document.getElementById("demo").innerHTML =
		getMax(10,20,30,40) + "<br>" +
      getMax(10,20,30);
  </script>
</body>
</html>
Finding the maximum number
40
30

这里的 rest 参数 args 允许函数 getMax 接受任意数量的参数。

Spread Operator and Rest Parameters

展开运算符(…​)与 rest 参数密切相关,并且常常与它们一起使用。虽然 rest 参数将函数参数收集到一个数组中,但展开运算符执行相反的操作,将数组的元素展开到独立的参数中。

在上述找到最大值的示例中,我们同时使用了 rest 参数和展开运算符。

function getMax(...args){ // here ...args as rest parameter
    return Math.max(...args); // here ... works as spread operator
}

Example

在这个示例中,展开运算符 …​ 被用来将 numbers 数组作为一个独立的参数传递给 multiply 函数的元素。

<html>
<body>
   <div> Spread operator in JavaScript<div>
   <div id="demo"></div>
   <script>
      function multiply(a, b, c) {
         return a * b * c;
      }
      const numbers = [2, 3, 4];
      document.getElementById("demo").innerHTML = multiply(...numbers);
   </script>
</body>
</html>
Spread operator in JavaScript
24

Rest Parameter vs. Arguments Object

rest 参数的引入对我们如何处理可变长度参数列表的方式产生了影响,与使用 arguments 对象相比。我们来比较两种方法:

Rest Parameters

<html>
<body>
  <div> Sum using rest parameter in JavaScript:</div>
  <div id = "demo"> </div>
  <script>
    function sum(...numbers) {
      return numbers.reduce((total, num) => total + num, 0);
    }
    document.getElementById("demo").innerHTML = sum(1, 2, 3, 4, 5);
  </script>
</body>
</html>
Sum using rest parameter in JavaScript:
15

Arguments Object

<html>
<body>
  <div> Sum using arguments object in JavaScript:</div>
  <div id = "demo"> </div>
  <script>
    function sum() {
      const argsArray = Array.from(arguments);
      return argsArray.reduce((total, num) => total + num, 0);
    }
    document.getElementById("demo").innerHTML = sum(1, 2, 3, 4, 5);
  </script>
</body>
</html>
Sum using arguments object in JavaScript:
15

两种方法得到的结果相同,但 rest 参数的语法更加简洁易读。它还与其他现代 JavaScript 特征更保持一致性。

Destructuring with Rest Parameter

解构赋值是在 ES6 中引入的。它让我们访问数组的独立值,无需使用数组索引。我们可以使用解构赋值来从由 rest 参数创建的数组中提取值。

Example

在下面的示例中,解构赋值从 numbers 数组中提取了前两个元素。

<html>
<body>
  <div> Destructuring assignment with rest parameter</div>
  <div id = "demo"> </div>
  <script>
    function getFirstTwo(...numbers) {
      const [first, second] = numbers;
      return `First: ${first}, Second: ${second}`;
    }
    document.getElementById("demo").innerHTML = getFirstTwo(1, 2, 3, 4, 5);
  </script>
</body>
</html>
Destructuring assignment with rest parameter
First: 1, Second: 2