Este articulo necesita una revisión editorial. Cómo puedes ayudar.
Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.
La sintaxis de los parámetros rest nos permiten representar un número indefinido de argumentos como un arreglo.
Sintaxis
function(a, b, ...theArgs) { // ... }
Descripción
Si el ultimo argumento definido de una función se le antepone con . . ., éste se convierte en un arreglo cuyos elementos desde el 0 (inclusivo) hasta theArgs.length (exclusivo) son pasados a la función.
En el ejemplo superior, theArgs debería recolectar el tercer argumento de la función (debido a que el primero esta asignado a 'a' y el segundo a 'b') y todos los argumentos consecutivos
Diferencia entre los parámetros rest y el objeto arguments
Hay 3 principales diferencias entre los parámetros rest y el objeto arguments
:
- Los parámetros rest son sólo los que no se les ha asignado un nombre, mientras que el objeto arguments contiene todos los argumentos pasados a la función;
- El objeto
arguments
no es un arreglo real, mientras los parámetros rest son instancias deArray
, lo que significa que lo los metodos comosort
,map
,forEach
opop
pueden aplicarse directamente; - el objeto
arguments
tiene una funcionalidad adicional específica para ella misma ( como la propiedadcallee
).
De arguments a array
Los parámetros rest han sido agregados para reducir el codigo repetitivo que se usaba en los parámetros.
// Antes de los parámetros rest se realizaba: function f(a, b){ var args = Array.prototype.slice.call(arguments, f.length); // … } // Ahora es equivalente a function f(a, b, ...args) { }
Ejemplos
Desde que theArgs
es un arreglo, se puede obtener el tamaño del mismo usando la propiedad length
:
function fun1(...theArgs) { console.log(theArgs.length); } fun1(); // 0 fun1(5); // 1 fun1(5, 6, 7); // 3
En el siguiente ejemplo, se usa los parámetros rest para agrupar los argumentos desde el segundo en adelante. Luego lo multiplicamos por el primero:
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]
El siguiente ejemplo se muestra que se puede usar los metodos de Array
en los parámetros rest , pero no en el objeto arguments
:
function sortRestArgs(...theArgs) { var sortedArgs = theArgs.sort(); return sortedArgs; } console.log(sortRestArgs(5,3,7,1)); // shows 1,3,5,7 function sortArguments() { var sortedArgs = arguments.sort(); return sortedArgs; // this will never happen } // throws a TypeError: arguments.sort is not a function console.log(sortArguments(5,3,7,1));
Para poder usar los metodos de Array
en el objeto arguments
object, se debe convertir a un arreglo real primero.
Especificaciones
Especificación | Estado | Comentario |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Function Definitions' in that specification. |
Standard | definción inicial. |
ECMAScript 2017 Draft (ECMA-262) The definition of 'Function Definitions' in that specification. |
Draft |
Compatibilidad en Navegadores
Característica | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Soporte Básico | 47 | (Yes) | 15.0 (15.0) | No support | 34 | No support |
Característica | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
Soporte Básico | No support | 47 | 15.0 (15.0) | No support | No support | No support | 47 |