Valores de retorno en JavaScript: return y contratos | Nicolás Garzón
return termina la ejecución de una función y entrega un valor al lugar donde fue llamada.
JavaScript
Copiar function add ( first, second ) {
return first + second;
}
const result = add ( 2 , 3 ) ; JavaScript
Copiar function add ( first, second ) {
console. log ( first + second) ;
}
const result = add ( 2 , 3 ) ;
console. log ( result) ; console.log muestra información, pero no entrega ese valor a la llamada.
La versión reutilizable retorna el resultado:
JavaScript
Copiar function add ( first, second ) {
return first + second;
} Después quien llama decide qué hacer:
JavaScript
Copiar const result = add ( 2 , 3 ) ;
console. log ( result) ;
saveResult ( result) ; Toda función devuelve algo. Si no ejecuta un return con valor, devuelve undefined.
JavaScript
Copiar function greet ( ) {
console. log ( "Hello" ) ;
}
console. log ( greet ( ) ) ; También puede escribirse un retorno vacío:
JavaScript
Copiar function stopIfInvalid ( value ) {
if ( value < 0 ) {
return ;
}
processValue ( value) ;
} Ese return termina la función y devuelve undefined.
JavaScript
Copiar function example ( ) {
return "Finished" ;
console. log ( "This never runs" ) ;
} Todo lo que aparece después del retorno en el mismo camino es inalcanzable.
Un retorno temprano permite detener la función cuando una condición impide continuar.
JavaScript
Copiar function processOrder ( order ) {
if ( ! order) {
return { ok : false , reason : "Order is required" } ;
}
if ( order. items. length === 0 ) {
return { ok : false , reason : "Order is empty" } ;
}
return { ok : true , total : calculateTotal ( order. items) } ;
} Esto evita anidar todo el camino válido dentro de varios if.
Una función puede tener varios return, pero cada llamada solo ejecuta uno.
JavaScript
Copiar function getStockStatus ( stock ) {
if ( stock === 0 ) {
return "out-of-stock" ;
}
if ( stock <= 5 ) {
return "low-stock" ;
}
return "available" ;
} Los retornos deben mantener un contrato comprensible. Devolver tipos sin relación puede volver difícil usar la función.
JavaScript
Copiar function findUser ( id ) {
if ( ! id) return false ;
if ( ! database. has ( id) ) return "not-found" ;
return database. get ( id) ;
} Una alternativa más consistente:
JavaScript
Copiar function findUser ( id ) {
if ( ! id) {
return { ok : false , reason : "invalid-id" } ;
}
const user = database. get ( id) ;
if ( ! user) {
return { ok : false , reason : "not-found" } ;
}
return { ok : true , user } ;
} Una función puede devolver cualquier valor.
JavaScript
Copiar function createSummary ( order ) {
return {
id : order. id,
total : calculateTotal ( order. items) ,
} ;
} JavaScript
Copiar function getActiveProducts ( products ) {
return products. filter ( ( product ) => product. isActive) ;
} El valor devuelto puede ser nuevo o una referencia existente. El contrato debe dejar claro si el resultado puede modificarse sin afectar datos externos.
Las funciones también son valores.
JavaScript
Copiar function createMultiplier ( multiplier ) {
return function multiply ( value ) {
return value * multiplier;
} ;
}
const double = createMultiplier ( 2 ) ;
console. log ( double ( 5 ) ) ; Este patrón conecta funciones de orden superior y closures.
JavaScript
Copiar const double = ( number ) => number * 2 ; La expresión se retorna automáticamente.
Con llaves, return vuelve a ser necesario:
JavaScript
Copiar const double = ( number ) => {
number * 2 ;
} ;
console. log ( double ( 5 ) ) ; No coloques el valor retornado en una línea nueva después de return.
JavaScript
Copiar function createUser ( ) {
return
{
name : "Nicolás" ,
} ;
} JavaScript puede interpretar:
La función devuelve undefined.
Escribe el valor en la misma línea:
JavaScript
Copiar function createUser ( ) {
return {
name : "Nicolás" ,
} ;
} Un return solo termina la función donde aparece.
JavaScript
Copiar function findActiveUser ( users ) {
users. forEach ( ( user ) => {
if ( user. isActive) {
return user;
}
} ) ;
return null ;
} El return user termina el callback de forEach, no findActiveUser. La función exterior sigue y devuelve null.
JavaScript
Copiar function findActiveUser ( users ) {
return users. find ( ( user ) => user. isActive) ?? null ;
} Una función async envuelve el valor retornado en una promesa.
JavaScript
Copiar async function getValue ( ) {
return 10 ;
}
const result = getValue ( ) ;
console. log ( result instanceof Promise ) ; El bloque de asincronía profundizará este comportamiento.
JavaScript
Copiar function divide ( first, second ) {
if ( second === 0 ) {
throw new RangeError ( "Cannot divide by zero" ) ;
}
return first / second;
} return representa una salida normal. throw interrumpe el flujo mediante un error. Elegir depende del contrato y de si el caso forma parte de los resultados esperados.
JavaScript
Copiar function calculateLine ( item ) {
if ( ! item) {
return { ok : false , reason : "item-required" } ;
}
if ( ! Number. isInteger ( item. quantity) || item. quantity <= 0 ) {
return { ok : false , reason : "invalid-quantity" } ;
}
const subtotal = item. price * item. quantity;
return {
ok : true ,
line : {
productId : item. productId,
quantity : item. quantity,
subtotal,
} ,
} ;
} Todos los caminos devuelven una estructura compatible con una propiedad ok.
Confundir console.log con return.
Olvidar que una función sin retorno explícito devuelve undefined.
Escribir código después de un retorno que siempre se ejecuta.
Mezclar tipos de retorno sin un contrato claro.
Colocar el valor en una línea nueva después de return.
Esperar que un retorno dentro de un callback termine la función exterior.
Olvidar return al utilizar llaves en una arrow function.
Retornar una referencia mutable sin considerar quién puede modificarla.
return entrega un valor y termina la función actual.
Sin retorno explícito, el resultado es undefined.
Los retornos tempranos reducen anidamiento.
Todos los caminos deberían respetar un contrato comprensible.
Una función puede devolver cualquier valor, incluida otra función.
Un retorno dentro de un callback no retorna desde la función exterior.
console.log observa; return comunica un resultado.
JavaScript
Copiar function findValue ( values ) {
values. forEach ( ( value ) => {
if ( value === 3 ) {
return value;
}
} ) ;
return "not-found" ;
}
findValue ( [ 1 , 2 , 3 ] ) ; Respuesta Devuelve "not-found". El return value solo termina el callback actual de forEach.
Rest parameters explica cómo representar de forma explícita una cantidad variable de argumentos dentro de un array real.