石头剪刀布和 !== 比较

Rock Paper Scissors and the !== comparison

我想尝试使用 !== 条件。为什么此代码记录 'Invalid choice' 和未定义?

const getUserChoice = userInput => {
    userInput = userInput.toLowerCase();
    if (userInput !== 'rock' || userInput !== 'paper' || userInput !== 'scissors') {
        console.log('Invalid choice');
    } else {
        return userInput;
    }
};

console.log(getUserChoice('paper'));

我想在剪刀石头布游戏中尝试使用 !== 而不是 === if 语句。问题是语法还是逻辑?

无论 userInput 的值如何,此条件始终为真:

userInput !== 'rock' || userInput !== 'paper' || userInput !== 'scissors'

您想使用 && 而不是 ||,像这样:

userInput !== 'rock' && userInput !== 'paper' && userInput !== 'scissors'

这样,如果 userInput 不是三个允许值之一,您将只会看到 Invalid choice

最后,您看到了 undefined,因为您正在记录 getUserChoice 的输出,但是当 [=20] 时 getUserChoice 没有 return 任何内容=]语句被命中。

您的函数不会在 truthy if 路径上返回任何内容,只会在 else 路径上返回任何内容。

此外 if(x==="a" || x==="b" || ...)(又名 if(!(...)))的倒数是 if(x!=="a" && x!=="b" && ...) 您需要将 || 交换为 && 并将 && 交换为|| 也是,不只是 ===!==!=====

这更像是一个逻辑问题。您要求代码检查用户提交的值是否不同于 'rock' 或不同于 'paper' 或不同于 'scissor'.

因此,如果您尝试插入一个合适的值,例如 'paper',检查仍然会通过,因为 'paper' 无论如何都不同于 'rock' 或 'scissor'。

在这种情况下,您可能需要检查用户传递的单词是否不同于 'paper' AND 'rock' AND 'scissor'.

由于 Short-circuit evaluation,您获得 Invalid choice。这意味着,逻辑 OR (||) 表达式从左到右计算,任何左边的值得到 truthy-value 然后其余的将不会被计算。

userInput !== 'rock' || userInput !== 'paper' || userInput !== 'scissors'

userInput等于paper并执行上述条件第一个得到truthy-vaule,因为paperrock不一样。因此,其余的将不会被评估 (userInput !== 'paper' || userInput !== 'scissors')。该条件变为真并记录 invalid choice。在这种情况下你没有 return 任何东西所以 getUserChoice 函数 return undefined.