Olá Joab, boa tarde!
*Resolução do Problema: *
De acordo com a sua pergunta, mesmo não utilizando o operador "&&", você gostaria de saber como essa mudança afetou o processo da lógica proposta.
*Solução do Problema: *
De fato, ele realmente funcionou sem o operador "&&", mas ela afeta e muito a lógica do algoritmo. O intuito do programa é saber o imc de uma pessoa, sendo estabelecido um limite minimo e máximo que se pode alcançar para determinar sua condição (se esta acima dele, no recomendado ou abaixo). No if do professor há essa verificação:
if (imc >= 18.5 && imc <= 35) {
//lógica do professor
}
// Perceba que no if logo acima, a primeira condição a ser verifica é se imc é maior ou igual a 18.5
// (que por sua vez é um valor fixo), o valor que será retornado dessa condição é true. Nota: Esse exemplo abaixo
// é só para ilustrar o que esta acontecendo por "debaixo dos panos".
if (true && imc <= 35) {
}
// Depois dela, vem o operador "&&", que diz ao javaScript que há outra condição nesse mesmo if e que ele
// só vai entrar no bloco do if, se as duas condições forem true. Na segunda condição, ele verifica se
// o valor do imc é menor ou igual a 35, supondo que ele seja menor, o valor retornado será true. Que no final ele ficara assim:
if (true && true) {
// ele entra aqui dentro se as duas forem true
}
Nota: "O javaScript lê" o código de cima para baixo e da esquerda para a direita. Sabendo disso, vamos ver o erro da sua lógica. :
if (imc >= 18.5 <= 35) {
}
// Como não há um operador "&&" na condicional if, a primeira operação ser feita será se o imc é maior
// ou igual a 18.5. O valor que será retornado dessa operação será true. Ficando assim:
if (true <= 35) {
}
// Nisso, ele irá verificar se o valor que foi retornado da operação anterior (que por sua vez foi true) é menor
// ou igual a 35. O valor que será retornado dessa operação sera true, mas por que true?
// como ele retornou true se um valor é booleano e o outro é numérico?
// A resposta é simples, o valor numérico de true é 1 e o valor numérico de false é 0.
// (nota: o valor que é igual e não o tipo). Veja esses exemplos e refaça:
true == 1 // return --> true
true === 1 // return --> false
false == 0 // return --> true
false === 0 // return --> false
Ou seja, se o valor numérico de true é 1, logo é como se ele tivesse fazendo a seguinte operação:
// Disso daqui
if (true <= 35) {
}
// Por "debaixo dos panos vira isso aqui: "
if (1 <= 35) {
}
E como 1 é menor que 35, ele retorna true e entra na condicional do if.
*Conclusão: *
É de concluir que na sua lógica não há devida verificação de um limite minimo e máximo que se pode alcançar para determinar a condição (se esta acima dele, no recomendado ou abaixo) de seu usuário.
*Despedida: *
Tenha um bom estudo, se ainda houver dúvidas, farei o possível para responde-las.