Fala, Esperidião! Tudo bem?
Massa que você testou um caminho diferente — é exatamente assim que a coisa fixa. E o seu código funciona, tá? Só que tem dois pontos que valem a conversa:
1. Tem uma nota escapando
Repara no último if:
if(notaDoAluno<=3){
console.log('ruim')
}
E o anterior começa em >=4. O que acontece se a nota for 3.5? Ela não é >= 4 e também não é <= 3. Resultado: nada é impresso. O aluno fica sem classificação.
Com else, esse buraco não existe: tudo que não caiu nas condições anteriores vai pro ruim.
2. Você está fazendo o trabalho que o else if faria pra você
No seu código, cada if precisa delimitar o intervalo dos dois lados (>=7 && <9, >=4 && <7). Por quê? Porque os ifs são independentes: o JavaScript testa todos, um por um, mesmo depois de já ter achado a resposta.
Com else if, a leitura é em cascata: se entrou no primeiro bloco, os outros nem são avaliados. Então basta você dizer o limite de baixo, porque o de cima já foi "descartado" pelo bloco anterior:
if (notaDoAluno >= 9) {
console.log('Excelente')
} else if (notaDoAluno >= 7) { // aqui já sei que é < 9
console.log('bom')
} else if (notaDoAluno >= 4) { // aqui já sei que é < 7
console.log('médio')
} else { // sobrou? é ruim
console.log('ruim')
}
Menos condição escrita = menos lugar pra errar (e aquele 3.5 some do mapa).
Quando usar cada um?
if separados: quando as condições são independentes e mais de uma pode ser verdadeira ao mesmo tempo. Ex: "se tem desconto, aplica; se é frete grátis, aplica" — os dois podem acontecer.if / else if / else: quando as opções são mutuamente exclusivas e só uma deve rodar. Nota do aluno é o caso clássico: ele é excelente ou bom ou médio ou ruim, nunca dois ao mesmo tempo.
Testa aí com 3.5 nas duas versões e vê a diferença na prática. Qualquer dúvida, chama!