Ciao, la condizione viene eseguita come tu l'hai impostata; in sostanza si tratta esattamente di una "condizione sempre vera"; è solo una questione di logica.
Tieni presente che l'espressione nella condizione viene esaminata frammento per frammento da sinistra verso destra; usando un operatore || (OR logico) il risultato dell'intera condizione è true se almeno uno dei frammenti è true, per cui l'interprete JavaScript si interrompe al primo valore true che incontra; il resto non serve che sia esaminato, dal momento che l'esito della condizione è già stabilito.
In questa tua espressione:
codice:
scelta !="s" || scelta !="n"
l'omino JavaScript analizza per primo il frammento sulla sinistra:
se questo restituisce false, allora prosegue con l'analisi del secondo; se invece restituisce true, allora l'intera condizione è true, quindi l'analisi si interrompe qui, e ovviamente viene eseguito il codice nel corpo della condizione.
Ora, questo primo frammento ci vuole poco a renderlo true; basta che scelta sia diverso da "s", giusto?
In questo caso l'esito dell'intera condizione è già stabilito come true, quindi non c'è bisogno di esaminare il resto.
Mettiamo invece che il primo frammento restituisca false (quindi scelta è uguale "s"); pertanto l'omino JavaScript è costretto ad esaminare anche il secondo frammento. Qui però abbiamo un dato certo, cioè scelta è uguale "s", per cui non potrà mai essere uguale a "n", giusto?
In questo caso, dato che il frammento scelta !="n" restituisce true, l'esito della condizione sarà anch'esso true.
Ecco perché si tratta di una "condizione sempre vera".
La soluzione è molto semplice: dovrai usare un operatore && (AND logico) anziché ||.
codice:
if (scelta != "s" && scelta != "n")
Lo stesso risultato puoi ottenerlo con un || ma usando delle uguaglianze dentro un blocco di parentesi e negando tale blocco:
codice:
if (!(scelta == "s" || scelta == "n"))