Quería intentar usar el !== condicional. ¿Por qué este código registra 'Opción no válida' e indefinido?
const getUserChoice = userInput => { userInput = userInput.toLowerCase(); if (userInput !== 'rock' || userInput !== 'paper' || userInput !== 'scissors') { console.log('Invalid choice'); } else { return userInput; } }; console.log(getUserChoice('paper'));Quería probar la instrucción !== en lugar de === if para un juego de piedra, papel o tijera. ¿El problema es la sintaxis o la lógica?
Esta condición siempre será verdadera, independientemente del valor de userInput :
userInput !== 'rock' || userInput !== 'paper' || userInput !== 'scissors' Quiere usar && en lugar de || , como esto:
userInput !== 'rock' && userInput !== 'paper' && userInput !== 'scissors' De esa manera, solo verá una Invalid choice no válida si userInput no es uno de los tres valores permitidos.
Por último, está viendo undefined porque está registrando el resultado de getUserChoice , pero getUserChoice no devuelve nada cuando se presiona la instrucción if .
Obtiene una Invalid choice debido a la evaluación de cortocircuito . Esto significa que la expresión lógica OR (||) se evalúa de izquierda a derecha y cualquiera de los valores de la izquierda obtiene un valor real, luego el resto no se evaluará.
userInput !== 'rock' || userInput !== 'paper' || userInput !== 'scissors' Cuando userInput es igual a paper y ejecuta la condición anterior, el primero obtiene un valor real porque paper y rock no son lo mismo. Entonces, el resto de ellos no serán evaluados (userInput !== 'paper' || userInput !== 'scissors') . Esa condición se vuelve verdadera y registra una invalid choice . Y en la condición en que no devolvió nada, entonces la función getUserChoice devuelve undefined .
Su función no devuelve nada en el camino verdadero si, solo en el camino más.
También el inverso de if(x==="a" || x==="b" || ...) (también conocido como if(!(...)) ) es if(x!=="a" && x!=="b" && ...) necesitas intercambiar || a && y && a || también, no solo === a !== y !== a === .