Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
3
respuestas

[Duda] Duda a la hora de optimizar un poco más el código

Estuve buscando una manera de optimizar la función de limpiarCaja(); ya que esta seleccionando un elemento que ya ha sido seleccionado anteriormente, entonces me parecía innecesario tener que volver a seleccionarlo e intenté simplemente cambiarle el valor. Sin embargo, esto no funciona.

Explico de manera más fiel qué fue lo que hice. Este es el código que tengo escrito actualmente, funciona igual que al del instructor a pesar de que tenga alguna que otra cosa diferente por simple preferencia. Por ejemplo hago el incremento de la variable "intento" antes del if porque la tengo inicializada en 0 y no en 1. Pero sí, funciona todo igual:

function verificarIntento() {
    let numeroUsuario = parseInt(document.getElementById('valorUsuario').value);
    intento++;

    if (numeroSecreto === numeroUsuario) {
        asignarTextoElemento('p', `Acertaste! El número es: ${numeroSecreto}. Lo lograste en ${intento} ${intento == 1 ? 'intento' : 'intentos'}`);
        document.getElementById('reiniciar').removeAttribute('disabled');
    } else {
        asignarTextoElemento('p', `El número secreto es ${numeroSecreto > numeroUsuario ? 'mayor' : 'menor'}`);
    }

    limpiarCaja();
}

function limpiarCaja() {
    document.querySelector('#valorUsuario').value = '';
}

Bueno, básicamente lo que yo quería optimizar es en la función de limpiarCaja() precisamente, ya que esta seleccionando el mismo elemento que ya se selecciona en "numeroUsuario". Primero intenté declarar numeroUsuario con var en vez de let, para que pudiera ser utilizada fuera de esa función, luego de eso realicé la función de limpiar caja así:

function limpiarCaja() {
    numeroUsuario = '';
}

Bueno, no funcionó y el número dentro del input no desaparecía. Luego vi incluso innecesario hacer todo lo anterior y decidí, dentro de la misma función de verificarIntento(), cambiar el valor de la variable así:

function verificarIntento() {
    let numeroUsuario = parseInt(document.getElementById('valorUsuario').value);
    intento++;

    if (numeroSecreto === numeroUsuario) {
        asignarTextoElemento('p', `Acertaste! El número es: ${numeroSecreto}. Lo lograste en ${intento} ${intento == 1 ? 'intento' : 'intentos'}`);
        document.getElementById('reiniciar').removeAttribute('disabled');
    } else {
        asignarTextoElemento('p', `El número secreto es ${numeroSecreto > numeroUsuario ? 'mayor' : 'menor'}`);
    }

    numeroUsuario = '';
}

Esto es algo que me parece bastante lógico desde un principio. Yo ya estoy seleccionando el valor que hay dentro del elemento (en este caso, el input correspondiente al id valorUsuario) y lo estoy almacenando en una variable. Una vez que fue comparado y operado dentro de la función, quiero que ese valor se convierta en algo "nulo" cuando la vuelvo a definir. Pero no entiendo por qué razón simplemente no cambia el valor cuando utilizo una variable que ya almacena lo que necesito modificar, pero cuando almaceno exactamente lo mismo en una variable diferente ahora sí me deja modificar la otra variable (que sería valorCaja como en el video de la clase, por ejemplo).

Es que inclusive si yo hago la función así:

function limpiarCaja() {
    valorCaja = document.getElementById('valorUsuario').value = '';
}

Me está funcionando y me esta limpiando el campo como si nada. No entiendo entonces por qué si esa variable esta almacenando exactamente lo mismo que numeroUsuario, con una sí cambia el valor y con la otra no... Según la lógica que he llevado hasta ahora, este cógido debería funcionar:

function verificarIntento() {
    let numeroUsuario = parseInt(document.getElementById('valorUsuario').value);
    intento++;

    if (numeroSecreto === numeroUsuario) {
        asignarTextoElemento('p', `Acertaste! El número es: ${numeroSecreto}. Lo lograste en ${intento} ${intento == 1 ? 'intento' : 'intentos'}`);
        document.getElementById('reiniciar').removeAttribute('disabled');
    } else {
        asignarTextoElemento('p', `El número secreto es ${numeroSecreto > numeroUsuario ? 'mayor' : 'menor'}`);
    }

    numeroUsuario = '';
}

Básicamente porque numeroUsuario tiene almacenado el valor del input correspondiente al id "valorUsuario", exactamente igual a la variable valorCaja o a la función limpiarCaja() en sí como el primer código que adjunté:

function limpiarCaja() {
    document.querySelector('#valorUsuario').value = '';
}

No sé entonces por qué con una variable sí deja cambiar el valor del elemento y con la otra no.

Mil gracias al profesor que me resuelva esta duda porque llevo rato echandole cabeza y no le encuentro la lógica. Perdón si me extendí mucho, pero realmente quiero asegurarme de que me hago entender, y espero que sí me haya hecho entender porque mi objetivo es conseguir una respuesta y una explicación precisa. Muchas gracias de antemano por cualquier respuesta. Éxitos!

3 respuestas

Por cierto, tengo sospechas de que quizá algo tiene que ver ese parseInt en la variable numeroUsuario , y es por eso que no podría poner un valor vacío en el input. De todas formas si es eso lo que sucede, quisiera saber si hay alguna manera de optimizar el código al menos parecida a cómo lo tengo pensado, porque imagino que habrá manera de optimizar algo que está siendo almacenado dos veces sin una aparente estricta necesidad.

Este es el código completo que tengo actualmente en caso de ser necesario:


let numeroSecreto = generarNumeroSecreto();
let intento = 0;

function asignarTextoElemento(elemento, texto) {
    let elementoHTML = document.querySelector(elemento);  //Primero se define una variable seleccionando el elemento a modificar.
    elementoHTML.innerHTML = texto;  //Con esta propiedad se le asigna el valor correspondiente a la sintaxis del elemento.
}

function generarNumeroSecreto() {
    return Math.floor(Math.random()*10 + 1);
}

function verificarIntento() {
    let numeroUsuario = parseInt(document.getElementById('valorUsuario').value); //Con el value, agarramos el valor que tendría el elemento seleccionado.
    intento++;

    if (numeroSecreto === numeroUsuario) {
        asignarTextoElemento('p', `Acertaste! El número es: ${numeroSecreto}. Lo lograste en ${intento} ${intento == 1 ? 'intento' : 'intentos'}`);
        document.getElementById('reiniciar').removeAttribute('disabled');
    } else {
        asignarTextoElemento('p', `El número secreto es ${numeroSecreto > numeroUsuario ? 'mayor' : 'menor'}`);
    }

    limpiarCaja();
}

function limpiarCaja() {
    document.querySelector('#valorUsuario').value = ''; //Este # es para indicar que quiero seleccionar por id. Es una manera alternativa a la que se usó anteriormente.
}

asignarTextoElemento('h1', 'Juego del Número Secreto');
asignarTextoElemento('p', 'Elige un número del 1 al 10');
solución!

no, lo que pasa es que al principio lo que estás obteniendo en realidad es un valor de tipo entero, no el objeto como tal, quiero decir... si quisieras solo obtener el objeto para despues sobreescribirlo tendrías que eliminar el .value

let numeroUsuario = parseInt(document.getElementById('valorUsuario').value); //Esto es lo que tú haces...

//Esta es mi sugerencia.
let objCajaTexto = document.getElementById('valorUsuario');//Así obtienes el objeto y tienes acceso a todas sus propiedades
let numeroUsuario = parseInt(objCajaTexto.value);//Así obtienes el valor del objeto anterior
objCajaTexto.value = ''; //Así limpias la caja

Espero haberme explicado bien :)

Muchas gracias Juan Manuel por responder. Funciona y la verdad cambió un poco más el concepto que tenía a la hora de manejar las variables con estos métodos.

Según lo que inferí, no se puede almacenar un valor (con el .value) en una variable para luego modificarlo, ya que según veo no es posible modificar el valor una vez esta almacenado en la variable. Lo que sí se puede hacer, es que el objeto que contiene ese valor sea almacenado en una variable y luego con el .value asignarle un valor distinto al que tenga en el DOM. Así no estarías modificando el valor sino sobreescribiéndolo.

No sé si esa sea la explicación concreta de por qué sucede este fenómeno. La verdad no sé mucho de la sintaxis ni la jerarquía/ingeniería que tiene Javascript detrás, entonces si me equivoco en algo o vez que hay algún matíz importante a resaltar te agradecería mucho si me lo haces saber; entender lo que sucede me ayuda bastante para manejar el código con soltura y saber solucionar errores similares en el futuro. Espero que de alguna manera te llegue notificación para que me lo aclares si puedes :).