Parámetros y argumentos en JavaScript: diseño y valores | Nicolás Garzón
Los parámetros son los nombres definidos por una función. Los argumentos son los valores enviados al llamarla.
JavaScript
Copiar function greet ( name ) {
return ` Hello, ${ name} ` ;
}
greet ( "Nicolás" ) ;
name es el parámetro.
"Nicolás" es el argumento.
Cada llamada crea bindings nuevos para sus parámetros.
JavaScript
Copiar function calculateTotal ( price, quantity ) {
return price * quantity;
}
calculateTotal ( 20 , 2 ) ;
calculateTotal ( 50 , 3 ) ; Las dos llamadas usan valores independientes. Los parámetros solo existen dentro de la función.
JavaScript no exige que la cantidad de argumentos coincida con la cantidad de parámetros.
JavaScript
Copiar function greet ( name, role ) {
console. log ( name, role) ;
}
greet ( "Nicolás" ) ; Texto
Copiar Nicolás undefinedEl parámetro sin argumento recibe undefined.
Eso puede producir resultados inesperados:
JavaScript
Copiar function multiply ( first, second ) {
return first * second;
}
multiply ( 5 ) ; La función debe decidir si un dato puede faltar, tiene un valor por defecto o debe validarse.
Los argumentos adicionales no se asignan a parámetros declarados.
JavaScript
Copiar function greet ( name ) {
return ` Hello, ${ name} ` ;
}
greet ( "Nicolás" , "developer" , 21 ) ; La llamada es válida y la función utiliza "Nicolás". Los demás valores siguen formando parte de la llamada, pero no tienen un parámetro con nombre.
Cuando una función acepta una cantidad variable, es mejor declararlo con rest parameters.
Un parámetro puede definir el valor que utilizará cuando el argumento sea undefined o no se envíe.
JavaScript
Copiar function greet ( name = "Guest" ) {
return ` Hello, ${ name} ` ;
}
greet ( ) ;
greet ( undefined ) ;
greet ( null ) ; null no activa el valor por defecto porque es un valor explícito distinto de undefined.
JavaScript
Copiar function createId ( prefix = ` item- ${ Date. now ( ) } ` ) {
return prefix;
} La expresión no se calcula una sola vez al definir la función. Se evalúa cada vez que se necesita el valor por defecto.
Un parámetro posterior puede utilizar uno anterior.
JavaScript
Copiar function createRange ( start, end = start + 10 ) {
return { start, end } ;
} El orden contrario no funciona de la misma manera:
JavaScript
Copiar function example ( first = second, second = 10 ) {
return first + second;
}
example ( ) ; second todavía no está inicializado cuando se evalúa el valor por defecto de first.
Una función puede extraer propiedades directamente desde un argumento.
JavaScript
Copiar function createUserLabel ( { name, role } ) {
return ` ${ name} — ${ role} ` ;
} Esto expresa qué datos necesita la función.
También puede combinarse con valores por defecto:
JavaScript
Copiar function createUserLabel ( { name, role = "user" } ) {
return ` ${ name} — ${ role} ` ;
} JavaScript
Copiar function createUserLabel ( { name = "Unknown" } = { } ) {
return name;
} El = {} exterior permite llamar la función sin argumento.
JavaScript
Copiar function createUserLabel ( { name } ) {
return name;
}
createUserLabel ( ) ; JavaScript no puede desestructurar undefined.
En una función posicional, el significado depende del orden.
JavaScript
Copiar createUser ( "Nicolás" , true , false , "admin" ) ; No es evidente qué representan los booleanos.
Cuando existen muchos parámetros o varias opciones, un objeto suele ser más claro.
JavaScript
Copiar createUser ( {
name : "Nicolás" ,
isActive : true ,
sendWelcomeEmail : false ,
role : "admin" ,
} ) ; También facilita añadir opciones sin cambiar el orden de las llamadas existentes.
JavaScript siempre pasa valores.
JavaScript
Copiar function replaceValue ( value ) {
value = 100 ;
}
let number = 10 ;
replaceValue ( number) ;
console. log ( number) ; Cuando el argumento es un objeto, el valor pasado es una referencia al objeto.
JavaScript
Copiar function renameUser ( user ) {
user. name = "Nico" ;
}
const user = { name : "Nicolás" } ;
renameUser ( user) ;
console. log ( user. name) ; La función recibió una copia de la referencia. Puede utilizarla para modificar el mismo objeto, pero reasignar el parámetro no reemplaza la variable exterior.
JavaScript
Copiar function replaceUser ( user ) {
user = { name : "Other" } ;
}
replaceUser ( user) ;
console. log ( user. name) ; Si una función no promete modificar el argumento, crear un valor nuevo suele ser más predecible.
JavaScript
Copiar function renameUser ( user, name ) {
return {
... user,
name,
} ;
} El contrato debe ser claro. Funciones como sort, reverse o splice pueden mutar estructuras recibidas si se usan directamente sobre ellas.
Las funciones normales tienen acceso a un objeto especial llamado arguments.
JavaScript
Copiar function showArguments ( ) {
console. log ( arguments) ;
}
showArguments ( "A" , "B" , "C" ) ; arguments es parecido a un array, pero no es un array real y no existe como binding propio en arrow functions.
En código moderno, los rest parameters suelen ser más explícitos y cómodos.
La propiedad length indica cuántos parámetros aparecen antes del primer parámetro con valor por defecto o rest.
JavaScript
Copiar function example ( first, second, third = 0 , ... rest ) { }
console. log ( example. length) ; No indica cuántos argumentos recibirá una llamada. Es metadata sobre la declaración.
Cuando una función recibe información externa, debe validar lo que necesita.
JavaScript
Copiar function calculateTotal ( price, quantity ) {
if ( ! Number. isFinite ( price) || price < 0 ) {
throw new TypeError ( "Price must be a non-negative number" ) ;
}
if ( ! Number. isInteger ( quantity) || quantity <= 0 ) {
throw new TypeError ( "Quantity must be a positive integer" ) ;
}
return price * quantity;
} No toda función interna necesita repetir todas las validaciones. La ubicación depende de qué capa sea responsable de garantizar los datos.
JavaScript
Copiar function searchProducts ( {
query = "" ,
category = null ,
limit = 20 ,
includeInactive = false ,
} = { } ) {
const normalizedQuery = query. trim ( ) . toLowerCase ( ) ;
return productRepository. search ( {
query : normalizedQuery,
category,
limit,
includeInactive,
} ) ;
} El objeto de opciones hace visibles los significados, permite valores por defecto y evita depender de un orden difícil de recordar.
Confundir parámetros con argumentos.
Suponer que JavaScript exige la misma cantidad en definición y llamada.
Olvidar que un argumento faltante produce undefined.
Esperar que null active un parámetro por defecto.
Usar demasiados parámetros posicionales.
Desestructurar un argumento que puede ser undefined sin valor por defecto.
Modificar objetos recibidos sin que el contrato lo comunique.
Decir que JavaScript “pasa objetos por referencia” sin aclarar que pasa un valor de referencia.
Utilizar arguments cuando rest parameters serían más claros.
Los parámetros pertenecen a la definición; los argumentos pertenecen a la llamada.
Los faltantes reciben undefined.
Los adicionales son válidos.
Los valores por defecto se activan con undefined, no con null.
Los parámetros se inicializan de izquierda a derecha.
Destructuring puede hacer explícitos los datos necesarios.
Un objeto de opciones mejora llamadas con muchas configuraciones.
JavaScript pasa valores, incluidas referencias a objetos.
La mutación de argumentos debe ser una decisión visible.
¿Qué devuelve cada llamada?
JavaScript
Copiar function greet ( name = "Guest" ) {
return name;
}
greet ( ) ;
greet ( undefined ) ;
greet ( null ) ;
greet ( "" ) ; Respuesta Devuelven "Guest", "Guest", null y "", respectivamente. Solo la ausencia o undefined activan el valor por defecto.
Valores de retorno explica cómo una función entrega resultados, cuándo termina su ejecución y por qué retornar no es lo mismo que imprimir.