--- title: ¿Qué ha salido mal? Corrigiendo JavaScript slug: Learn/JavaScript/First_steps/What_went_wrong tags: - Aprender - Artículo - CodingScripting - Debugging - Depurando - Error - Herramientas de Desarrollador - JavaScript - Novato - Principiante - Tutorial - console.log - depurar - 'l10n:priority' translation_of: Learn/JavaScript/First_steps/What_went_wrong ---
Cuando construiste el juego "Adivina el número" en el artículo anterior, es posible que hayas descubierto que no funcionó. Tranquilo — este artículo tiene como objetivo evitar que te rasques la cabeza por este tipo de problemas brindándote algunos consejos sobre cómo encontrar y corregir errores en programas JavaScript.
Prerrequisitos: | Conocimientos básicos de informática, comprensión básica de HTML y CSS, comprensión de lo que es JavaScript. |
---|---|
Objetivo: | Para ganar habilidad y confianza para comenzar a solucionar problemas en tu propio código. |
En general, cuando haces algo mal en el código, hay dos tipos principales de errores con los que te encontrarás:
Bueno, tampoco es así de simple — a medida que profundices hay algunas otras diferencias. Pero las clasificaciones anteriores funcionarán en esta temprana etapa de tu carrera. Veremos ambos tipos en el futuro.
Para empezar, regresemos a nuestro juego de adivinan el número — excepto que esta vez vamos a explorar una versión que tiene algunos errores insertados deliberadamente. Ve a GitHub y haz una copia local de number-game-errors.html (puedes verlo en vivo aquí).
Nota: ¡Posiblemente tengas tu propia versión del ejemplo del juego que no funciona, y quizás la quieras arreglar! Aún así nos gustaría que en el artículo trabajes con nuestra versión, para que puedas aprender las técnicas que estamos enseñando. Después puedes tratar de arreglar tu ejemplo.
En este punto, consultemos la consola del desarrollador para ver si podemos ver algún informe de error de sintaxis y luego tratar de solucionarlo. Abajo aprenderás cómo.
Anteriormente en este curso, hicimos que escribieras algunos comandos JavaScript simples en la consola JavaScript de las herramientas para desarrolladores (si no recuerdas cómo abrirla en tu navegador, sigue el enlace anterior para descubrirlo). Lo más útil es que la consola te brinda mensajes de error cada vez que ocurre algún error de sintaxis dentro del JavaScript que alimenta al motor JavaScript del navegador. Ahora vayamos a cazar.
number-game-errors.html
y abre tu consola JavaScript. Deberías ver un mensaje de error con las siguientes líneas: guessSubmit.addeventListener('click', checkGuess);
guessSubmit.addeventListener no es una función
", lo cual significa que el intérprete de JavaScript no reconoce la función que estamos llamando. A menudo, este mensaje de error en realidad significa que hemos escrito algo mal. Si no estás seguro de la ortografía correcta de una parte de la sintaxis, a menudo es bueno buscar la función en MDN. La mejor manera de hacer esto es, en tu navegador favorito, buscar "mdn nombre-de-característica". Aquí hay un atajo para ahorrarte algo de tiempo en esta instancia: addEventListener()
.addeventListener
a addEventListener
debería solucionar este problema. Hazlo ahora.Nota: Échale un vistazo a nuestra página de referencia TypeError: "x" no es una función para obtener más detalles sobre este error.
TypeError: lowOrHi es nulo
", en la línea 78.
Null
es un valor especial que significa "nada" o "sin valor". Por lo tanto, lowOrHi
ha sido declarado e iniciado, pero no con algún valor significativo — no tiene tipo ni valor.checkGuess() {...}
). Como pronto aprenderás con más detalle en nuestro artículo de funciones, el código dentro de las funciones se ejecuta en un ámbito separado que el código fuera de las funciones. En este caso, el código no se ejecutó y el error no se lanzó hasta que la función checkGuess()
se ejecutó en la línea 86.lowOrHi.textContent = '¡El número es muy grande!';
textContent
de la constante lowOrHi
en una cadena de texto, pero no funciona porque lowOrHi
no contiene lo que es supone. Veamos por qué es así — intenta buscar otras instancias de lowOrHi
en el código. La primera instancia que encontrarás en JavaScript está en la línea 48:
const lowOrHi = document.querySelector('lowOrHi');
null
después de ejecutar esta línea. Agrega el siguiente código en la línea 49:
console.log(lowOrHi);
Nota: console.log()
es una función de depuración realmente útil que imprime un valor en la consola. Por lo tanto, imprimirá el valor de lowOrHi
en la consola tan pronto como intentemos configurarlo en la línea 48.
console.log()
en tu consola. lowOrHi
es null
en este punto, así que definitivamente hay un problema con la línea 48.document.querySelector()
para obtener una referencia a un elemento seleccionándolo con un selector CSS. Buscando más adelante en nuestro archivo, podemos encontrar el párrafo en cuestión:
<p class="lowOrHi"></p>
.
), pero el selector que se pasa al método querySelector()
en la línea 48 no tiene punto. ¡Este podría ser el problema! Intenta cambiar lowOrHi
a .lowOrHi
en la línea 48.console.log()
debería devolver el elemento <p>
que queremos. ¡Uf! ¡Otro error solucionado! Ahora puedes eliminar tu línea console.log()
, o mantenerla como referencia más adelante — tu elección.Nota: Consulta nuestra página de referencia TypeError: "x" (no) es "y" para obtener más detalles sobre este error.
TypeError: resetButton.addeventListener no es una función
". Sin embargo, esta vez aparece como procedente de la línea 94.addeventListener
a .addEventListener
. Hazlo ahora.En este punto, el juego debería trabajar bien, sin embargo, después de jugar varias veces, sin duda notarás que el número "aleatorio" que debes adivinar siempre es 1. ¡Definitivamente no es exactamente como queremos que se desarrolle el juego!
Obviamente hay un problema en la lógica del juego en alguna parte — el juego no devuelve un error; simplemente no está jugando bien.
randomNumber
y las líneas donde se establece primero el número aleatorio. La instancia que almacena el número aleatorio que queremos adivinar al comienzo del juego debe estar alrededor de la línea número 44:
let randomNumber = Math.floor(Math.random()) + 1;Y la que genera el número aleatorio antes de cada juego subsiguiente está alrededor de la línea 113:
randomNumber = Math.floor(Math.random()) + 1;
console.log()
— inserta la siguiente línea directamente debajo de cada una de las dos líneas anteriores:
console.log(randomNumber);
randomNumber
es igual a 1 en cada punto en el que se registra en la consola.Para solucionar esto, consideremos cómo está funcionando esta línea. Primero, invocamos a Math.random()
, que genera un número decimal aleatorio entre 0 y 1, p. ej. 0.5675493843.
Math.random()
A continuación, pasamos el resultado de invocar a Math.random()
a Math.floor()
, que redondea el número pasado al número entero más cercano. Luego agregamos 1 a ese resultado:
Math.floor(Math.random()) + 1
Redondear un número decimal aleatorio entre 0 y 1 siempre devolverá 0, por lo que agregarle 1 siempre devolverá 1. Necesitamos multiplicar el número aleatorio por 100 antes de redondearlo hacia abajo. Lo siguiente nos daría un número aleatorio entre 0 y 99:
Math.floor(Math.random()*100);
De ahí que queramos sumar 1, para darnos un número aleatorio entre 1 y 100:
Math.floor(Math.random()*100) + 1;
Intenta actualizar ambas líneas de esta manera, luego guarda y refresca — ¡el juego ahora debería trabajar como pretendemos!
Hay otros errores comunes que encontrarás en tu código. Esta sección destaca la mayoría de ellos.
falta ; antes de la declaración
Este error generalmente significa que has omitido un punto y coma al final de una de sus líneas de código, pero a veces puede ser más críptico. Por ejemplo, si cambiamos esta línea dentro de la función checkGuess()
:
var userGuess = Number(guessField.value);
a
var userGuess === Number(guessField.value);
Lanza este error porque cree que estás intentando hacer algo diferente. Debes asegurarte de no confundir el operador de asignación (=
), que establece una variable para que sea igual a un valor — con el operador de igualdad estricta (===
), que prueba si un valor es igual a otro y devuelve un resultado true
/false
.
Nota: Ve más detalles sobre este error en nuestra página de referencia SyntaxError: falta ; antes de la declaración.
Este podría ser otro síntoma de confusión entre la asignación y los operadores de igualdad estricta. Por ejemplo, si cambiamos esta línea dentro de checkGuess()
:
if (userGuess === randomNumber) {
a
if (userGuess = randomNumber) {
la prueba siempre devolvería true
, haciendo que el programa informe que se ganó el juego. ¡Ten cuidado!
falta ) después de la lista de argumentos
Este es bastante simple — generalmente significa que olvidaste colocar el paréntesis de cierre al final de una llamada a una función/método.
Nota: Ve más detalles sobre este error en nuestra página de referencia SyntaxError: falta ) después de la lista de argumentos.
falta : después de la propiedad id
Este error generalmente se relaciona con un objeto JavaScript formado incorrectamente, pero en este caso logramos obtenerlo cambiando
function checkGuess() {
a
function checkGuess( {
Esto ha hecho que el navegador piense que estamos tratando de pasar el contenido de la función a la función como un argumento. ¡Cuidado con esos paréntesis!
falta } después del cuerpo de la función
Esto es fácil — generalmente significa que has omitido una de tus llaves de una función o estructura condicional. Obtuvimos este error al eliminar una de las llaves de cierre cerca de la parte inferior de la función checkGuess()
.
esperaba expresión, obtuve 'string'
o SyntaxError: Cadena literal sin terminar
Estos errores generalmente significan que has omitido las comillas de apertura o cierre de un valor de cadena. En el primer error anterior, string se reemplazaría con los caracteres inesperados que encontró el navegador en lugar de una comilla al comienzo de una cadena. El segundo error significa que la cadena no se ha terminado con comillas.
Para todos estos errores, piensa en cómo abordamos los ejemplos que vimos en el tutorial. Cuando surge un error, mira el número de línea que te dan, ve a esa línea y revísala para detectar lo que está mal. Ten en cuenta que el error no necesariamente estará en esa línea, y también que el error podría no ser causado por el mismo problema que mencionamos anteriormente.
Nota: Obtén más detalles sobre estos errores en nuestras páginas de referencia SyntaxError: símbolo inesperado y SyntaxError: cadena literal sin terminar.
Ahí lo tienes, los conceptos básicos para descubrir errores en programas sencillos de JavaScript. No siempre será tan sencillo averiguar qué está mal en tu código, pero al menos esto te ahorrará algunas horas de sueño y te permitirá progresar un poco más rápido cuando las cosas no salgan bien, especialmente en las primeras etapas de tu viaje de aprendizaje.
{{PreviousMenuNext("Learn/JavaScript/First_steps/A_first_splash", "Learn/JavaScript/First_steps/Variables", "Learn/JavaScript/First_steps")}}