Parâmetros Rest
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since setembro de 2016.
A sintaxe de rest parameter (parâmetros rest) nos permite representar um número indefinido de argumentos como um array.
Sintaxe
function(a, b, ...theArgs) {
// ...
}
Descrição
Se o último argumento nomeado de uma função tiver prefixo com ..., ele irá se tornar um array em que os elemento de 0 (inclusive) até theArgs.length (exclusivo) são disponibilizados pelos argumentos atuais passados à função.
No exemplo acima, theArgs irá coletar o terceiro argumento da função (porquê o primeiro é mapeado para a, e o segundo para b) e assim por diante em todos os argumentos consecutivos.
Diferença entre rest parameters e arguments object
Há três diferenças principais entre rest parameters e os arguments objects:
- rest parameters são os únicos que não foram atribuidos a um nome separado, enquanto os
argumentsobject contêm todos os argumentos passados para a função; - o objeto
argumentsnão é um array, enquanto rest parameters são instânciasArray, isso significa que métodos comosort,map,forEachoupoppodem ser aplicados diretamente; - o objeto
argumentspossui a funcionalidade adicional de especificar ele mesmo (como a propriedadecallee).
De arguments para array
Rest parameters foram criados para reduzir o código padrão que foi induzida pelos argumentos
// Antes rest parameters, o seguinte codigo pode ser encontrado
function f(a, b){
var args = Array.prototype.slice.call(arguments, f.length);
// ...
}
// esse é o equivalente
function(a, b, ...args) {
}
Exemplos
Como theArgs é um array, você pode pegar número de elementos usando a propriedade length:
function fun1(...theArgs) {
console.log(theArgs.length);
}
fun1(); // 0
fun1(5); // 1
fun1(5, 6, 7); // 3
No próximo exemplo, nós usamos o rest parâmetro para buscar argumentos do segundo parâmetro para o fim. Nós multiplicamos eles pelo primeiro parâmetro:
function multiply(multiplier, ...theArgs) {
return theArgs.map(function (element) {
return multiplier * element;
});
}
var arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]
O próximo exemplo mostra como você pode usar metodos do Array em rest params, mas não no objeto arguments:
function sortRestArgs(...theArgs) {
var sortedArgs = theArgs.sort();
return sortedArgs;
}
console.log(sortRestArgs(5, 3, 7, 1)); // Exibe 1,3,5,7
function sortArguments() {
var sortedArgs = arguments.sort();
return sortedArgs; // isso nunca irá ocorrer
}
// throws a TypeError: arguments.sort is not a function
console.log(sortArguments(5, 3, 7, 1));
a fim de usar o objeto arguments, você precisará converte-lo para um array antes.
Especificações
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-function-definitions> |
Compatibilidade
Loading…