myfreax

JavaScript 剩余参数

您将学习如何使用 JavaScript 剩余参数来收集参数并将它们全部放入一个数组

JavaScript 剩余参数
JavaScript 剩余参数

在本教程中,您将学习如何使用 JavaScript 剩余参数来收集参数并将它们全部放入一个数组。

JavaScript rest 参数介绍

ES6 提供一种新的参数,称为 rest parameter,它的前缀是三个点 ...。剩余参数允许您将不定数量的参数表示为数组。请参见以下语法:

function fn(a,b,...args) {
   //...
}

最后一个参数 args 以三点 ... 为前缀。它称为剩余参数 ...args

您传递给函数的所有参数都将映射到参数列表。在上面的语法中,第一个参数映射到 a,第二个参数映射到 b,第三个、第四个等将作为 args 数组存储在剩余参数中。

例如:

fn(1, 2, 3, "A", "B", "C");

args 数组将存储以下值:

[3,'A','B','C']

如果只传递前两个参数,其余参数将是一个空数组:

fn(1,2);

args 将是:

[]

请注意,剩余参数必须出现在参数列表的末尾。以下代码将会抛出错误 SyntaxError: Rest parameter must be last formal parameter:

function fn(a,...rest, b) {
 // error
}

错误:

SyntaxError: Rest parameter must be last formal parameter

JavaScript 剩余参数示例

请阅读以下示例:

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

sum(1, 2, 3);

脚本的输出是:

6

在这个例子中,args 在一个数组中。因此,您可以使用 for..of 循环遍历其元素并对它们求和。

假设 sum() 函数的调用者可能会传递各种数据类型的参数,例如 numberstringboolean,而您只想计算数字的总数:

function sum(...args) {
  return args
    .filter(function (e) {
      return typeof e === 'number';
    })
    .reduce(function (prev, curr) {
      return prev + curr;
    });
}

以下脚本使用 sum() 函数仅对数字参数求和:

let result = sum(10,'Hi',null,undefined,20); 
console.log(result);

输出:

30
请注意,如果没有剩余参数,则必须使用函数的 arguments 对象。

但是,arguments 对象本身不是 Array 类型的实例。因此,您不能直接使用 filter() 方法。

在 ES5 ,您必须按如下方式使用 Array.prototype.filter.call()

function sum() {
  return Array.prototype.filter
    .call(arguments, function (e) {
      return typeof e === 'number';
    })
    .reduce(function (prev, curr) {
      return prev + curr;
    });
}

如您所见,rest 参数使代码更加优雅。假设您需要根据指定类型(例如数字、字符串、布尔值和空值)过滤参数。以下函数可以帮助您做到这一点:

function filterBy(type, ...args) {
  return args.filter(function (e) {
    return typeof e === type;
  });
}

JavaScript 剩余参数和箭头函数

箭头函数没有 arguments 对象。因此,如果要向箭头函数传递一些参数,则必须使用剩余参数。

请阅读以下示例:

const combine = (...args) => {
  return args.reduce(function (prev, curr) {
    return prev + ' ' + curr;
  });
};

let message = combine('JavaScript', 'Rest', 'Parameters'); // =>
console.log(message); // JavaScript Rest Parameters

输出:

JavaScript Rest Parameters

combine() 函数是一个箭头,它接受不定数量的参数并将这些参数连接起来。

JavaScript rest 参数在动态函数

JavaScript 允许您通过 Function 构造函数创建动态函数。并且可以在动态函数使用 rest 参数。

这是一个例子:

var showNumbers = new Function('...numbers', 'console.log(numbers)');
showNumbers(1, 2, 3);

输出:

[ 1, 2, 3 ]

在本教程中,您学习了如何使用 JavaScript 剩余参数将不定数量的参数表示为数组。

内容导航