1
resposta

[Dúvida] If não sendo tratado como condicional

Enquanto fazia um dos exercícios da plataforma sobre o jogo de adivinhar o número tentei me adiantar e dar a opção de ter repetidas tentativas com o que já sabia antes de explicarem como e tentei o seguinte código

alert ('Boas vindas ao nosso site! Vamos jogar um jogo? Tente acertar o número secreto!!'); let numeroSecreto = 17; let tentativa = prompt ("Escolha um número de 1 a 30"); if (numeroSecreto == tentativa){alert("Acertou! O número secreto era "+numeroSecreto+"!")} else {let tentativa2 = prompt("Errado :( Mas não desanime, você ainda tem 2 tentativas") if(tentativa2 == numeroSecreto){alert("Acertou! O número secreto era "+numeroSecreto+"!")} else {let tentativa3 = prompt ("Está é sua ultíma tentativa, escolha com sabedoria.") if (tentativa3 == numeroSecreto) {alert("Acertou! O número secreto era "+numeroSecreto+"!" ) } else {alert("Infelizmente suas chances acabaram :/ O número secreto era: "+numeroSecreto)} } } Insira aqui a descrição dessa imagem para ajudar na acessibilidade ) no entanto não funcionou de primeira até que eu fiz a alteração de mudar o último if de linha e ele passou a funcionar segue abaixo como ficou:

alert ('Boas vindas ao nosso site! Vamos jogar um jogo? Tente acertar o número secreto!!');
let numeroSecreto = 17;
let tentativa = prompt ("Escolha um número de 1 a 30");
if (numeroSecreto == tentativa){alert("Acertou! O número secreto era "+numeroSecreto+"!")} else 
{let tentativa2 = prompt("Errado :( Mas não desanime, você ainda tem 2 tentativas")
    if(tentativa2 == numeroSecreto){alert("Acertou! O número secreto era "+numeroSecreto+"!")} else
    {let tentativa3 = prompt ("Está é sua ultíma tentativa, escolha com sabedoria.")
        if (tentativa3 == numeroSecreto) {alert("Acertou! O número secreto era "+numeroSecreto+"!" ) }
    else {alert("Infelizmente suas chances acabaram :/ O número secreto era: "+numeroSecreto)}
}
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeO problema já foi resolvido com essa modificação mas gostaria de saber por que no primeiro caso o if não é reconhecido como função condicional/embaralha todo o código e como o que ele estava sendo reconhecido nesse caso para tentar entender melhor oq causou o erro

1 resposta

Olá Victor, boa noite. Espero que esteja bem...

Em nossas linguagens de computação, os nossos códigos são avaliados linha após linha, e tudo que está dentro de uma única linha pode ser considerado um único bloco de código.

Quando você declara {let tentativa3 = prompt ("Está é sua última tentativa, escolha com sabedoria.") if (tentativa3 == numeroSecreto) {alert("Acertou! O número secreto era "+numeroSecreto+"!" ) } em uma única linha (sem a quebra com a qual você resolveu o problema), o interpretador do JavaScript na máquina (no caso o node.js), irá entender que tudo será um único bloco de código. Aí mora o problema, porquê o interpretador irá ter duas situações distintas para tratar: a declaração de uma variável (com o let tentativa3) e uma análise condicional (com o if à frente). Porém, o próprio if necessita ter seu próprio bloco de código, para tratar com clareza os seus escopos e comparações. Dessa forma, o interpretador vai estourar um erro de Sintaxe, dizendo que ele encontrou um token desconhecido "if", e que isso não está pertinente com a sintaxe do JS.

Quando você quebra a linha, a mágica para o interpretador acontece, pois você acabou de criar um novo bloco de código, e agora somente o if será analisado naquela nova linha. E com isso, o fluxo normal de um if será analisado. Por isso não ocorre o erro.

Um outro detalhe importante: sabe qual outro símbolo na sintaxe do JS quebra blocos de código? O ponto e vírgula (" ; "). Isso mesmo. Se você terminar uma determinada declaração passando o ";" ao final da mesma, ele irá começar um novo bloco de código, mesmo que as declarações estejam na mesma linha. Por exemplo: você pode declarar múltiplas variáveis em uma única linha com o ";", basta fazer const a = 2; const b = 3; const ..., sempre separando com o ";".

Assim, faça um teste você mesmo. Vá ao fim do seu 3º prompt, coloque o ";" ao fim (depois do fechamento do parêntesis) e retorne o if para a mesma linha do prompt, você verá que o erro irá ser resolvido.

Porém, atente-se a um fato, declarar mais de um bloco de código por linha é um péssimo padrão de programação, então evite-o ao máximo. Sempre quebre suas linhas, para maior facilidade de leitura e interpretação de sua lógica e de seu código. Outra coisa: sempre que seus if's tiverem apenas uma declaração para resolver, evite as chaves na mesma linha, então por exemplo: use if (a > b) console.log("a é maior que b") ao invés de if (a > b) { console.log("a é maior que b") }. Isso se deve ao fato de as chaves ( "{" "}" ) determinarem um bloco de código com escopo próprio para o if.

Espero ter ajudado. Abraços...