3
respostas

var existe = false

Não entendi pq a variável 'existe' precisa ficar fora do bloco do FOR. Se a variável fica dentro, o programa entra num loop de apenas perguntar o ingrediente 1. Alguém sabe o motivo?

<meta charset="UTF-8">

<h1>Receitas do Yan</h1>

<script>
    var ingredientes = [];

    var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));

    var contador = 1;

    while( contador <= quantidade) {

        var ingrediente = prompt("Informe o ingrediente " + contador);

        for(var posicao = 0; posicao < ingredientes.length; posicao++){
            ~~~~var existe = false;~~~~
            if (ingrediente == ingredientes[posicao]){
                    alert("Esse já foi adicionado.");
                    existe = true;
                break;
            }
        }
            if (existe == false){
                ingredientes.push(ingrediente);
                    contador++;    
            }

    }
    console.log(ingredientes);
</script>
3 respostas

Se você criar o var existe dentro do for, ele só vai existir ali dentro. E quando chegar no if(existe==false) ele nunca consegue comparar já que a variável existe não foi criada. Dessa forma, você nunca entra no if e nunca faz o contador++. Comentei no código onde q da o problema

for(var posicao = 0; posicao < ingredientes.length; posicao++){
            ~~~~var existe = false;~~~~
//desse jeito, var existe, só é reconhecida dentro desse for
            if (ingrediente == ingredientes[posicao]){
                    alert("Esse já foi adicionado.");
                    existe = true;
                break;
            }
        }
//chegando aqui você pede pra verificar se exite == false
//mas para o programa é como se o **existe** n tive sido criado
//e desse jeito você nunca entra no if e nunca soma no valor do contador
            if (existe == false){
                ingredientes.push(ingrediente);
                    contador++;    
            }

Faça essa modificação no if para fazer o teste e ficar mais claro o que acontece:

if (existe == false){
    console.log("Entrou no if");
                ingredientes.push(ingrediente);
                    contador++;    
} else {
    console.log("Não entrou no if");
}

Eu pensei que o programa lesse linha por linha.

Quero dizer, mesmo que a variável encontre-se dentro do FOR, o programa sempre vai entrar no FOR, e a sequência só vai ser quebrada 3 linhas abaixo, na instrução 'break'.

Por isso achei que independentemente de onde a variável se encontrasse, contanto que não fosse depois do IF, ela seria reconhecida pelo programa.

Não é assim que o JS deveria funcionar?

Realmente o programa é lido linha a linha. Mas nesse caso o problema está relacionado ao FOR. O que está acontecendo é que o programa nunca entra no FOR e o var existe nunca é criado. Se você reparar a condição pra entrar no FOR é:

for(var posicao = 0; posicao < ingredientes.length; 
posicao++){

Ou seja, posicao que vale zero precisa ser menor que ingredientes.length que também está valendo zero

//não tem nenhum tamanho definido e nenhum item portanto seu length é zero
var ingredientes = [];

Já que zero < zero resulta em false o programa nunca entra no FOR e por consequência nunca cria o var existe e dessa forma nunca entra no if. Já que não entra no if o contador nunca é alterado e o loop do while fica infinito.

Também uma observação só pra ficar mais claro, aquele break quebra somente o loop do FOR, mas ele não está afetando o while. E ignore o primeiro comentário, respondi sobre a criação da variável me baseando em java, mas no js ocorre de maneira diferente. Fiz uns testes e você estava certo sobre o que importa é se foi criado antes. Mesmo assim, ainda faz mais sentido declarar somente uma vez fora, já que que dentro do FOR você vai declarar várias vezes (uma por loop) sem nenhuma necessidade.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software