JavaScript Rest Parameter 怎么用?

文章导读
Previous Quiz Next Rest ParameterJavaScript 中的 rest parameter 允许函数接受可变数量的参数,并将其作为数组。当需要传递给函数的参数数量不固定时,可以使用 rest parameters。
📋 目录
  1. Rest Parameter
  2. 展开运算符和剩余参数
  3. 剩余参数 vs. Arguments 对象
  4. 与剩余参数结合的解构
A A

JavaScript - Rest Parameter



Previous
Quiz
Next

Rest Parameter

JavaScript 中的 rest parameter 允许函数接受可变数量的参数,并将其作为数组。当需要传递给函数的参数数量不固定时,可以使用 rest parameters。

JavaScript rest parameters 允许你将所有剩余参数收集到一个数组中。rest parameter 使用三个点(...)后跟一个参数名来表示。这个参数名就是包含所有剩余参数的数组。

Rest Parameter 语法

JavaScript 中的 rest parameter 在函数声明中使用三个点(...)后跟一个参数名。

function functionName(para1, para2, ...theArgs){
   // 函数体;
}

这里 para1para2 是普通参数,而 theArgs 是 rest parameter。rest parameter 收集剩余的参数(这里,是除对应 para1para2 的参数外的其他参数),并将其赋值给名为 theArgs 的数组。

我们也可以在 function expression 中以与 function declaration 相同的方式编写 rest parameter。

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

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

函数定义只能有一个 rest parameter。

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

示例:可变长度参数列表

当你想定义一个能够处理可变数量参数的函数时,rest parameters 非常有用。让我们看下面的示例 —

<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

这里,rest parameter nums 允许函数接受任意数量的数字参数。

示例:查找最大数

JavaScript rest parameter 简化了在给定数字集合中查找最大数的过程。

在这个示例中,我们使用 rest parameter 来收集传递给函数的所有参数。spread operator 用于将单个值传递给 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 parameter args 允许函数 getMax 接受任意数量的参数。

展开运算符和剩余参数

展开运算符(...)与剩余参数密切相关,并且经常与它们一起使用。剩余参数将函数参数收集到一个数组中,而展开运算符执行相反的操作,将数组的元素展开为单个参数。

在上例中寻找最大数的例子中,我们同时使用了剩余参数和展开运算符。

function getMax(...args){ // 这里 ...args 作为剩余参数
    return Math.max(...args); // 这里 ... 作为展开运算符
}

示例

在这个示例中,展开运算符 ... 用于将 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

剩余参数 vs. Arguments 对象

剩余参数的引入改变了我们处理可变长度参数列表的方式,与使用 arguments 对象相比。让我们比较两种方法:

剩余参数

<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 对象

<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

虽然两种方法都能实现相同的结果,但剩余参数语法更简洁、更易读。它也与其他现代 JavaScript 特性行为更一致。

与剩余参数结合的解构

解构赋值在 ES6 中引入。它允许我们无需使用数组索引即可访问数组的单个值。我们可以使用解构赋值从剩余参数创建的数组中提取值。

示例

在下面的示例中,解构赋值从 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