alguien puede explicarme cómo esta función devuelve ['y','e','s'] en lugar de solo la cadena 'yes'???? el valor de num primero será 8, luego la condición else funcionará, luego num será [5,6,7] y nuevamente la condición else funcionará, luego num finalmente se convierte en una matriz vacía [] que completará la condición if, entonces debería regresar 'sí' pero no lo hace!?
function ABC(num, ...rest) { if (num < 5) { return 'yes'; } else { return [...ABC(rest)]; } }; console.log(ABC(8, 5, 6, 7));Cuando num < 5 devuelve yes .
Si el primer argumento no activa eso, el que yes será devuelto a:
return [...ABC(rest)];
Donde se extenderá y se colocará en una matriz.
Cuando realiza una llamada recursiva, tiene [...ABC(rest)] que primero ejecuta la función y luego distribuye su resultado en una matriz. Esto es más claro si añadimos una variable intermedia:
let recursive_result = ABC(rest); return [...recursive_result]; Lo que pretendías hacer era primero esparcir el rest en los argumentos de la función y luego devolver el resultado directamente:
let recursive_result = ABC(...rest); return recursive_result; Al solucionar eso, encontramos otro problema, que es que una vez que la matriz está vacía, la función se llamará sin argumentos, y num será undefined , que todavía no es "menos de 5". Eso significa que nunca se alcanzará la declaración if , y seguiremos recurriendo para siempre (hasta que su motor JS se dé por vencido y genere un error).
Al detectar undefined explícitamente, obtenemos el resultado que esperaba:
function ABC(num, ...rest) { if (num < 5 || typeof num == 'undefined' ) { return 'yes'; } else { return ABC(...rest); } }; console.log(ABC(8, 5, 6, 7));Si agrega algunos console.log , se vuelve más claro:
function ABC(num, ...rest) { console.log(`num=`, num, ", rest=", rest) if (num < 5) { console.log(`returning 'yes'`) return 'yes'; } else { console.log(`returning [...ABC(${rest})]`) return [...ABC(rest)]; } }; console.log(ABC(8, 5, 6, 7)); Así que entra en else y devuelve [...ABC([5, 6, 7])] . Solo hay un argumento, una matriz. Así que en la ejecución 2:
[5, 6, 7] < 5 ? Falso. Así que va en el else de nuevo. Devuelve [...ABC([])] .
[] < 5 ? Cierto, por extraño que parezca. Entonces ABC([]) devuelve 'yes' .
Pero luego este 'yes' se devuelve a la llamada de función anterior , es decir, [...ABC([])] , que se convierte en [...'yes'] , que es ['y', 'e', 's'] .