Rest parameters en JavaScript: argumentos variables | Nicolás Garzón
Un rest parameter agrupa los argumentos restantes de una llamada dentro de un array.
JavaScript
Copiar function sum ( ... numbers) {
return numbers. reduce (
( total, number ) => total + number,
0 ,
) ;
}
sum ( 1 , 2 , 3 , 4 ) ; La sintaxis utiliza tres puntos antes del nombre del parámetro.
JavaScript
Copiar function example ( ... values) {
console. log ( values) ;
}
example ( "A" , "B" , "C" ) ; Los argumentos individuales quedan agrupados en una colección.
El rest parameter puede aparecer después de parámetros normales.
JavaScript
Copiar function createMessage ( type, ... parts ) {
return ` [ ${ type} ] ${ parts. join ( " " ) } ` ;
}
createMessage ( "INFO" , "Server" , "started" ) ;
type recibe "INFO".
parts recibe ["Server", "started"].
JavaScript
Copiar function invalid ( ... values, last) { } Esto produce un SyntaxError. Después del rest parameter no pueden existir más parámetros porque ya representa todos los argumentos restantes.
Solo puede existir un rest parameter en la lista.
JavaScript
Copiar function collect ( first, ... rest ) {
return rest;
}
collect ( "A" ) ; rest siempre será un array, incluso cuando no existan argumentos restantes.
JavaScript
Copiar function legacyExample ( ) {
console. log ( arguments) ;
}
Está disponible en funciones normales.
Contiene todos los argumentos.
No es un array real.
No existe como binding propio en arrow functions.
JavaScript
Copiar function modernExample ( ... args) {
console. log ( args) ;
}
Son explícitos en la firma.
Producen un array real.
Funcionan en funciones normales y arrow functions.
Pueden representar solo los argumentos restantes.
JavaScript
Copiar function average ( ... numbers) {
if ( numbers. length === 0 ) {
return 0 ;
}
const total = numbers. reduce (
( sum, number ) => sum + number,
0 ,
) ;
return total / numbers. length;
} No hace falta convertir numbers antes de usar map, filter, reduce u otros métodos.
Una función variádica sigue necesitando un contrato.
JavaScript
Copiar function sum ( ... numbers) {
const hasInvalidNumber = numbers. some (
( number ) => ! Number. isFinite ( number) ,
) ;
if ( hasInvalidNumber) {
throw new TypeError ( "All values must be finite numbers" ) ;
}
return numbers. reduce (
( total, number ) => total + number,
0 ,
) ;
} Ambos utilizan ..., pero hacen operaciones opuestas según el contexto.
JavaScript
Copiar function sum ( ... numbers) {
} JavaScript
Copiar const values = [ 1 , 2 , 3 ] ;
sum ( ... values) ; En la llamada, los elementos del array se convierten en argumentos individuales.
Texto
Copiar rest: argumentos → array
spread: array → argumentosJavaScript
Copiar function logAndCall ( callback, ... args ) {
console. log ( "Calling with:" , args) ;
return callback ( ... args) ;
}
function multiply ( first, second ) {
return first * second;
}
logAndCall ( multiply, 5 , 4 ) ; args agrupa los valores recibidos y spread los expande al llamar callback.
Una cantidad variable puede ser útil para operaciones como sumar, combinar o registrar valores.
JavaScript
Copiar mergeTags ( "frontend" , "react" , "typescript" ) ; Sin embargo, si cada argumento tiene un significado diferente, un objeto de opciones suele ser más claro.
JavaScript
Copiar createUser ( "Nicolás" , true , false , "admin" ) ; No debería convertirse en una colección solo para evitar definir un contrato.
JavaScript
Copiar createUser ( {
name : "Nicolás" ,
isActive : true ,
sendEmail : false ,
role : "admin" ,
} ) ; La misma sintaxis puede agrupar elementos restantes al desestructurar, aunque en ese contexto no es un parámetro.
JavaScript
Copiar const [ first, ... remaining] = [ 10 , 20 , 30 ] ; JavaScript
Copiar const { password, ... publicUser } = user; La intención es parecida: separar una parte y reunir lo que queda.
JavaScript
Copiar function createEventLogger ( scope ) {
return function logEvent ( eventName, ... details ) {
console. log ( {
scope,
eventName,
details,
timestamp : Date. now ( ) ,
} ) ;
} ;
}
const logCheckout = createEventLogger ( "checkout" ) ;
logCheckout (
"payment-failed" ,
"order-123" ,
"insufficient-funds" ,
) ; eventName tiene un significado fijo y details acepta información adicional variable.
Confundir rest con spread por usar la misma sintaxis.
Colocar parámetros después del rest parameter.
Esperar que el rest reciba todos los argumentos cuando existen parámetros anteriores.
Convertir el rest a array aunque ya es un array real.
Usar arguments dentro de una arrow function.
Aceptar cualquier cantidad y tipo de datos sin validar.
Reemplazar una interfaz clara por una lista variable difícil de entender.
Rest agrupa argumentos restantes dentro de un array.
Debe aparecer al final de la lista de parámetros.
Puede recibir cero elementos.
Es más explícito y práctico que arguments.
Puede combinarse con parámetros normales.
Rest agrupa y spread expande.
Una función variádica también necesita reglas claras sobre sus valores.
¿Qué contiene cada parámetro?
JavaScript
Copiar function example ( first, second, ... rest ) {
console. log ( first, second, rest) ;
}
example ( "A" , "B" , "C" , "D" ) ; Respuesta first contiene "A", second contiene "B" y rest contiene ["C", "D"].
Callbacks explica cómo una función puede entregarse a otra para que esta decida cuándo y con qué valores ejecutarla.