Descargo de responsabilidad: soy nuevo en JS. Por lo tanto, todas mis pruebas están pasando menos una, la última, y no puedo encontrar la manera de solucionarlo. ¿Por qué 0 devuelve el último elemento y no una matriz vacía? Además, en una nota separada, cuando traté de usar un valor predeterminado, devolvió los valores incorrectos, por lo que decidí incluir una declaración condicional.
const takeRight = (array, n) => { n = -n; //setting both default and a negative value for 'n': if there is no number, then n should be -1 const condition = !n ? -1 : n; return array.slice(condition); }; console.log(takeRight([1, 2, 3])); // returns [3] --> expected [3] console.log(takeRight([1, 2, 3], 2)); //returns [2, 3] --> expected [2,3] console.log(takeRight([1, 2, 3], 5)); //returns [1, 2, 3] --> expected [1,2,3] console.log(takeRight([1, 2, 3], 0)); //returns [3] --> expected []El problema está en el cálculo de la variable de condition :
const condition = !n ? -1 : n; expresión !0 es verdadera, por lo que n se cambia a -1 cuando tiene valor 0 .
Si no desea verificar con números, use isNaN .:
const takeRight = (array, n) => { n = isNaN(n) ? -1 : -n; return array.slice(n); };El problema podría ser tu expresión. Verifique "No es un número"
const condition = isNaN(n) ? -1 : n;MDN: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/isNaN
Entonces, en primer lugar, no debe reasignar argumentos. Pero el problema real aquí es usar !n para probar si existe. Puede ser un buen truco aquí y allá, pero en realidad es confuso. Prefijar cualquier cosa con un ! en JavaScript lo convierte en un booleano y luego lo niega, y las reglas para esta conversión no son obvias y tampoco son las mismas en todos los idiomas. Pero en JS, !0 te da el mismo resultado que !undefined o !null , porque el número 0 a menudo simboliza un "estado fuera de lugar", básicamente un false , pero más corto. De todos modos, para evitar todo eso, solo use los parámetros predeterminados y use un operador ternario en la declaración de retorno para verificar el caso específico de n = 0 así:
const takeRight = (array, n = 1) => n === 0 ? [] : condition array.slice(-n);Por supuesto, también puede hacerlo un poco más detallado:
const takeRight = (array, n = 1) => { if (n === 0) { return []; } return condition array.slice(-n); }; EDITAR: ¡Incluso !"" devuelve true por cierto, que tampoco es realmente "obvio", ¡así que usar ! para verificar si algo está definido o existe, realmente puede causar problemas y resultados inesperados. Lo desaconsejaría a menos que realmente sepa lo que está haciendo y por qué.